Compartilhar via


SecurityTokenService.GetScope(ClaimsPrincipal, RequestSecurityToken) Método

Definição

Obtém um objeto Scope que contém informações sobre a RP (terceira parte confiável) associada à solicitação (RST) especificada. Você deve substituir esse método em sua implementação da 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

Parâmetros

principal
ClaimsPrincipal

Um ClaimsPrincipal que representa o cliente fazendo a solicitação.

request
RequestSecurityToken

Um RequestSecurityToken que representa a solicitação (RST) de entrada.

Retornos

Um Scope que encapsula as informações de RP associadas à solicitação.

Exemplos

O exemplo de código usado neste tópico é obtido do Custom Token exemplo. Este exemplo fornece classes personalizadas que permitem o processamento de SWT (Tokens Web Simples) e inclui uma implementação de um STS passivo capaz de servir um token SWT. Para obter um exemplo de como implementar um STS ativo, você pode ver o Federation Metadata exemplo. Para obter informações sobre esses exemplos e outros exemplos disponíveis para WIF e sobre onde baixá-los, consulte Índice de exemplo de código WIF.

O exemplo de código a seguir mostra uma implementação do GetScope método . Essa implementação verifica se o RP é reconhecido pelo STS, valida o ReplyTo endereço na solicitação e define a Scope.ReplyToAddress propriedade adequadamente e define as credenciais de assinatura e criptografia a serem usadas com o RP com base em certificados embutidos em código no arquivo.

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

Comentários

O GetScope método é chamado do pipeline de emissão de token após o ValidateRequest método e deve retornar um Scope objeto configurado para a solicitação de entrada. (O pipeline de emissão de token é implementado no Issue método .) O Scope objeto encapsula informações sobre o RP associado à RST (solicitação de token de segurança). Isso inclui informações sobre as credenciais de criptografia e assinatura a serem usadas com o RP e se devem ou não criptografar tokens emitidos e/ou chaves simétricas na resposta. Algumas tarefas típicas executadas no GetScope método são:

  • Determine se o RP para o qual o token se destina é um RP reconhecido. A forma como isso é feito depende da sua implementação. Se o RP pretendido não for um RP válido para esse STS, o método deverá gerar um InvalidRequestException.

  • Determine as credenciais de assinatura a serem usadas na resposta (RSTR) e defina a SigningCredentials propriedade adequadamente.

  • Determine se a resposta e/ou as chaves simétricas incluídas devem ser criptografadas e as credenciais a serem usadas para criptografia. Defina as TokenEncryptionRequiredpropriedades , SymmetricKeyEncryptionRequirede EncryptingCredentials adequadamente.

    Importante

    Por padrão, as TokenEncryptionRequired propriedades e SymmetricKeyEncryptionRequired são definidas true para impedir que o STS emita tokens que não são seguros. É recomendável que essas propriedades nunca sejam definidas como false em um ambiente de produção.

  • Determine o endereço para o qual a resposta deve ser retornada. Defina a AppliesToAddress propriedade ou ReplyToAddress adequadamente.

Notas aos Implementadores

Você deve substituir esse método em sua implementação da classe SecurityTokenService.

Aplica-se a

Confira também