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

Scope che incapsula le informazioni del componente associate alla richiesta.

Esempio

L'esempio di codice usato in questo argomento viene 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 stS passivo in grado di gestire un token SWT. Per un esempio di come implementare un servizio di sicurezza 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 l'RP sia riconosciuto dal servizio di sicurezza di rete, convalida l'indirizzo ReplyTo nella richiesta e imposta di conseguenza la Scope.ReplyToAddress proprietà e imposta le credenziali di firma e crittografia da usare con il rpd basato su 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 del Issue token viene implementata nel metodo. L'oggetto Scope incapsula informazioni sull'RP associato alla richiesta del token di sicurezza (RST). Sono incluse informazioni sulla crittografia e la firma delle credenziali da usare con il rpd e se crittografare o meno i token emessi e/o le chiavi simmetriche nella risposta. Alcune attività tipiche eseguite nel GetScope metodo sono:

  • Determinare se l'RP per il quale è previsto il token è un RP riconosciuto. Ciò dipende dall'implementazione. Se il rpd previsto non è un RP valido per questo servizio di sicurezza, il metodo deve generare un InvalidRequestExceptionoggetto .

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

  • 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 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 di conseguenza la AppliesToAddress proprietà o ReplyToAddress .

Note per gli implementatori

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

Si applica a

Vedi anche