SecurityTokenService.GetScope(ClaimsPrincipal, RequestSecurityToken) Méthode
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
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éfinirfalse
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.