SecurityTokenService.GetScope(ClaimsPrincipal, RequestSecurityToken) Método
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
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 comofalse
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.