SecurityTokenService.GetScope(ClaimsPrincipal, RequestSecurityToken) Método

Definição

Obtém um Scope objeto que contém informação sobre a parte confiável (RP) associada ao pedido especificado (RST). Tens de sobrescrever este método na tua implementação da SecurityTokenService classe.

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

A que representa o cliente que ClaimsPrincipal faz o pedido.

request
RequestSecurityToken

A RequestSecurityToken que representa o pedido recebido (RST).

Devoluções

A Scope que encapsula a informação RP associada ao pedido.

Exemplos

O exemplo de código utilizado neste tópico é retirado da Custom Token amostra. Este exemplo fornece classes personalizadas que permitem o processamento de Simples Web Tokens (SWT) e inclui uma implementação de um STS passivo capaz de servir um token SWT. Para um exemplo de como implementar um STS ativo, pode ver a Federation Metadata amostra. Para informações sobre estes exemplos e outros disponíveis para WIF e sobre onde os descarregar, consulte o Índice de Exemplos de Código WIF.

O exemplo de código seguinte mostra uma implementação do GetScope método. Esta implementação verifica se o RP é reconhecido pelo STS, valida o ReplyTo endereço no pedido e define a Scope.ReplyToAddress propriedade em conformidade, e define as credenciais de assinatura e encriptação para usar com o RP com base em certificados codificados diretamente no ficheiro.

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

Observações

O GetScope método é chamado do pipeline de emissão de tokens após o ValidateRequest método e deve devolver um Scope objeto configurado para o pedido recebido. (O pipeline de emissão de tokens é implementado no Issue método.) O Scope objeto encapsula informação sobre o RP associado ao pedido de token de segurança (RST). Isto inclui informações sobre as credenciais de encriptação e assinatura a serem usadas com o RP e se deve ou não encriptar quaisquer tokens emissos e/ou chaves simétricas na resposta. Algumas tarefas típicas realizadas no GetScope método são:

  • Determinar se o RP para o qual o token se destina é um RP reconhecido. A forma como isto é conseguido depende da sua implementação. Se o RP pretendido não for um RP válido para este STS, então o método deverá lançar um InvalidRequestException.

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

  • Determinar se a resposta e/ou quaisquer chaves simétricas incluídas devem ser encriptadas e as credenciais a serem usadas para encriptação. Defina os TokenEncryptionRequired, SymmetricKeyEncryptionRequired, e EncryptingCredentials propriedades em conformidade.

    Importante

    Por defeito, as TokenEncryptionRequired propriedades e SymmetricKeyEncryptionRequired são definidas true para impedir que o STS emita tokens que não sejam seguros. Recomenda-se que estas propriedades nunca sejam ativadas false num ambiente de produção.

  • Determine a morada a que a resposta deve ser devolvida. Defina a AppliesToAddress propriedade ou ReplyToAddress em conformidade.

Notas para Implementadores

Tens de sobrescrever este método na tua implementação da SecurityTokenService classe.

Aplica-se a

Ver também