SecurityTokenService.GetScope(ClaimsPrincipal, RequestSecurityToken) Metodo

Definizione

Ottiene un oggetto Scope contenente informazioni sul relying party (RP) associato alla richiesta specificata (RST). È necessario eseguire l'override di questo metodo nell'implementazione della classe 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

Parametri

principal
ClaimsPrincipal

Oggetto ClaimsPrincipal che rappresenta il client che esegue la richiesta.

request
RequestSecurityToken

Oggetto RequestSecurityToken che rappresenta la richiesta in entrata (RST).

Restituisce

Scope che incapsula le informazioni del componente associate alla richiesta.

Esempio

L'esempio di codice usato in questo argomento è tratto dall'esempio Custom Token . Questo esempio fornisce classi personalizzate che consentono l'elaborazione di token Web semplici (SWT) e include un'implementazione di un servizio token di sicurezza passivo in grado di gestire un token SWT. Per un esempio di come implementare un servizio token di sicurezza attivo, è possibile visualizzare l'esempio Federation Metadata . Per informazioni su questi esempi e altri esempi disponibili per WIF e su dove scaricarli, vedere Indice di esempio di codice WIF.

Nell'esempio di codice seguente viene illustrata un'implementazione del metodo GetScope. Questa implementazione verifica che il provider di servizi di sicurezza sia riconosciuto dal servizio token di sicurezza, convalida l'indirizzo ReplyTo nella richiesta e imposta la Scope.ReplyToAddress proprietà di conseguenza e imposta le credenziali di firma e crittografia da usare con il provider di sicurezza in base ai certificati hardcoded nel file.

// 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));
    }
}

Commenti

Il GetScope metodo viene chiamato dalla pipeline di rilascio del token dopo il ValidateRequest metodo e deve restituire un Scope oggetto configurato per la richiesta in ingresso. La pipeline di rilascio dei Issue token viene implementata nel metodo . L'oggetto Scope incapsula informazioni sul punto di ripristino associato alla richiesta del token di sicurezza (RST). Sono incluse informazioni sulla crittografia e sulla firma delle credenziali da usare con il punto di ripristino e se crittografare o meno i token rilasciati e/o le chiavi simmetriche nella risposta. Alcune attività tipiche eseguite nel GetScope metodo sono:

  • Determinare se il punto di ripristino per il quale è previsto il token è un rpo riconosciuto. La modalità di esecuzione dipende dall'implementazione. Se il punto di ripristino previsto non è un rpo valido per questo servizio token di sicurezza, il metodo deve generare un'eccezione InvalidRequestException.

  • Determinare le credenziali di firma da usare nella risposta (RSTR) e impostare la SigningCredentials proprietà di conseguenza.

  • Determinare se la risposta e/o le chiavi simmetriche incluse devono essere crittografate e le credenziali da usare per la crittografia. Impostare di conseguenza le TokenEncryptionRequiredproprietà , SymmetricKeyEncryptionRequirede EncryptingCredentials .

    Importante

    Per impostazione predefinita, le TokenEncryptionRequired proprietà e SymmetricKeyEncryptionRequired sono impostate true per impedire al servizio token di sicurezza di emettere token non sicuri. È consigliabile che queste proprietà non vengano mai impostate false su in un ambiente di produzione.

  • Determinare l'indirizzo in cui deve essere restituita la risposta. Impostare la AppliesToAddress proprietà o ReplyToAddress di conseguenza.

Note per gli implementatori

È necessario eseguire l'override di questo metodo nell'implementazione della classe SecurityTokenService.

Si applica a

Vedi anche