Partager via


SecurityTokenService.GetScope(ClaimsPrincipal, RequestSecurityToken) Méthode

Définition

Obtient un objet Scope qui contient des informations sur la partie de confiance (RP) associée à la demande spécifiée (RST). Vous devez substituer cette méthode dans votre implémentation de la classe de SecurityTokenService.

protected:
 abstract System::IdentityModel::Scope ^ GetScope(System::Security::Claims::ClaimsPrincipal ^ principal, System::IdentityModel::Protocols::WSTrust::RequestSecurityToken ^ request);
protected abstract System.IdentityModel.Scope GetScope (System.Security.Claims.ClaimsPrincipal principal, System.IdentityModel.Protocols.WSTrust.RequestSecurityToken request);
abstract member GetScope : System.Security.Claims.ClaimsPrincipal * System.IdentityModel.Protocols.WSTrust.RequestSecurityToken -> System.IdentityModel.Scope
Protected MustOverride Function GetScope (principal As ClaimsPrincipal, request As RequestSecurityToken) As Scope

Paramètres

principal
ClaimsPrincipal

ClaimsPrincipal représentant le client qui effectue la requête.

request
RequestSecurityToken

RequestSecurityToken qui représente la requête entrante (RST).

Retours

Scope qui encapsule des informations de RP (partie de confiance) associées à la demande.

Exemples

L’exemple de code utilisé dans cette rubrique est extrait de l’exemple Custom Token . Cet exemple fournit des classes personnalisées qui permettent le traitement des jetons web simples (SWT) et inclut une implémentation d’un STS passif capable de servir un jeton SWT. Pour obtenir un exemple d’implémentation d’un STS actif, vous pouvez voir l’exemple Federation Metadata . Pour plus d’informations sur ces exemples et d’autres exemples disponibles pour WIF et sur l’emplacement où les télécharger, consultez Index d’exemple de code WIF.

L'exemple de code suivant illustre une implémentation de la méthode GetScope. Cette implémentation vérifie que le RP est reconnu par le STS, valide l’adresse dans la ReplyTo demande et définit la Scope.ReplyToAddress propriété en conséquence, et définit les informations d’identification de signature et de chiffrement à utiliser avec le fournisseur de ressources en fonction des certificats codés en dur dans le fichier.

// Certificate Constants
private const string SIGNING_CERTIFICATE_NAME = "CN=localhost";
private const string ENCRYPTING_CERTIFICATE_NAME = "CN=localhost";

private SigningCredentials _signingCreds;
private EncryptingCredentials _encryptingCreds;
// Used for validating applies to address, set to URI used in RP app of application, could also have been done via config
private string _addressExpected = "http://localhost:19851/";
/// <summary>
/// This method returns the configuration for the token issuance request. The configuration
/// is represented by the Scope class. In our case, we are only capable of issuing a token to a
/// single RP identity represented by the _encryptingCreds field.
/// </summary>
/// <param name="principal">The caller's principal</param>
/// <param name="request">The incoming RST</param>
/// <returns></returns>
protected override Scope GetScope(ClaimsPrincipal principal, RequestSecurityToken request)
{
    // Validate the AppliesTo address
    ValidateAppliesTo( request.AppliesTo );

    // Create the scope using the request AppliesTo address and the RP identity
    Scope scope = new Scope( request.AppliesTo.Uri.AbsoluteUri, _signingCreds );

    if (Uri.IsWellFormedUriString(request.ReplyTo, UriKind.Absolute))
    {
        if (request.AppliesTo.Uri.Host != new Uri(request.ReplyTo).Host)
            scope.ReplyToAddress = request.AppliesTo.Uri.AbsoluteUri;
        else
            scope.ReplyToAddress = request.ReplyTo;
    }
    else
    {
        Uri resultUri = null;
        if (Uri.TryCreate(request.AppliesTo.Uri, request.ReplyTo, out resultUri))
            scope.ReplyToAddress = resultUri.AbsoluteUri;
        else
            scope.ReplyToAddress = request.AppliesTo.Uri.ToString() ;
    }

    // Note: In this sample app only a single RP identity is shown, which is localhost, and the certificate of that RP is 
    // populated as _encryptingCreds
    // If you have multiple RPs for the STS you would select the certificate that is specific to 
    // the RP that requests the token and then use that for _encryptingCreds
    scope.EncryptingCredentials = _encryptingCreds;

    return scope;
}
/// <summary>
/// Validates the appliesTo and throws an exception if the appliesTo is null or appliesTo contains some unexpected address.
/// </summary>
/// <param name="appliesTo">The AppliesTo parameter in the request that came in (RST)</param>
/// <returns></returns>
void ValidateAppliesTo(EndpointReference appliesTo)
{
    if (appliesTo == null)
    {
        throw new InvalidRequestException("The appliesTo is null.");
    }

    if (!appliesTo.Uri.Equals(new Uri(_addressExpected)))
    {
        throw new InvalidRequestException(String.Format("The relying party address is not valid. Expected value is {0}, the actual value is {1}.", _addressExpected, appliesTo.Uri.AbsoluteUri));
    }
}

Remarques

La GetScope méthode est appelée à partir du pipeline d’émission de jetons après la ValidateRequest méthode et doit retourner un Scope objet configuré pour la requête entrante. (Le pipeline d’émission de jetons est implémenté dans la Issue méthode.) L’objet Scope encapsule des informations sur le RP associé à la demande de jeton de sécurité (RST). Cela inclut des informations sur le chiffrement et la signature des informations d’identification à utiliser avec le rp et sur le chiffrement ou non des jetons émis et/ou des clés symétriques dans la réponse. Voici quelques-unes des tâches classiques effectuées dans la GetScope méthode :

  • Déterminez si le RP pour lequel le jeton est destiné est un RP reconnu. La façon dont cela est effectué dépend de votre implémentation. Si le rp prévu n’est pas un rp valide pour ce STS, la méthode doit lever un InvalidRequestException.

  • Déterminez les informations d’identification de signature à utiliser dans la réponse (RSTR) et définissez la SigningCredentials propriété en conséquence.

  • Déterminez si la réponse et/ou les clés symétriques incluses doivent être chiffrées et les informations d’identification à utiliser pour le chiffrement. Définissez les TokenEncryptionRequiredpropriétés , SymmetricKeyEncryptionRequiredet en EncryptingCredentials conséquence.

    Important

    Par défaut, les TokenEncryptionRequired propriétés et SymmetricKeyEncryptionRequired sont définies true pour empêcher le STS d’émettre des jetons qui ne sont pas sécurisés. Il est recommandé de ne jamais définir false ces propriétés sur dans un environnement de production.

  • Déterminez l’adresse à laquelle la réponse doit être retournée. Définissez la AppliesToAddress propriété ou ReplyToAddress en conséquence.

Notes pour les responsables de l’implémentation

Vous devez substituer cette méthode dans votre implémentation de la classe de SecurityTokenService.

S’applique à

Voir aussi