SecurityTokenService.GetScope(ClaimsPrincipal, RequestSecurityToken) Método
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
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
truepara impedir que o STS emita tokens que não sejam seguros. Recomenda-se que estas propriedades nunca sejam ativadasfalsenum 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.