Compartir a través de


SecurityTokenService.GetScope(ClaimsPrincipal, RequestSecurityToken) Método

Definición

Obtiene un objeto Scope que contiene información sobre el usuario de confianza (RP) asociado a la solicitud especificada (RST). Debe reemplazar este método en la implementación de la clase 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

ClaimsPrincipal que representa al cliente que realiza la solicitud.

request
RequestSecurityToken

RequestSecurityToken que representa la solicitud entrante (RST).

Devoluciones

Scope que encapsula información de RP adjuntada a la solicitud.

Ejemplos

El ejemplo de código que se usa en este tema se toma del Custom Token ejemplo. En este ejemplo se proporcionan clases personalizadas que permiten el procesamiento de tokens web simples (SWT) e incluye una implementación de un STS pasivo que es capaz de atender un token SWT. Para obtener un ejemplo de cómo implementar un STS activo, puede ver el Federation Metadata ejemplo. Para obtener información sobre estos ejemplos y otros ejemplos disponibles para WIF y sobre dónde descargarlos, consulte Índice de ejemplo de código WIF.

En el siguiente ejemplo de código se muestra la implementación del método GetScope. Esta implementación comprueba que el STS reconoce el RP, valida la ReplyTo dirección en la solicitud y establece la Scope.ReplyToAddress propiedad en consecuencia, y establece las credenciales de firma y cifrado que se van a usar con el RP en función de los certificados codificados de forma rígida en el archivo.

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

Comentarios

Se GetScope llama al método desde la canalización de emisión de tokens después del ValidateRequest método y debe devolver un Scope objeto configurado para la solicitud entrante. (La canalización de emisión de tokens se implementa en el Issue método ). El Scope objeto encapsula información sobre el RP asociado a la solicitud de token de seguridad (RST). Esto incluye información sobre el cifrado y las credenciales de firma que se usarán con el RP y si desea cifrar o no los tokens emitidos o claves simétricas en la respuesta. Algunas tareas típicas realizadas en el GetScope método son:

  • Determine si el RP para el que está previsto el token es un RP reconocido. El modo en que esto se logra depende de la implementación. Si el RP previsto no es un RP válido para este STS, el método debe iniciar una InvalidRequestExceptionexcepción .

  • Determine las credenciales de firma que se usarán en la respuesta (RSTR) y establezca la SigningCredentials propiedad en consecuencia.

  • Determine si la respuesta o las claves simétricas incluidas deben cifrarse y las credenciales que se usarán para el cifrado. Establezca las TokenEncryptionRequiredpropiedades , SymmetricKeyEncryptionRequiredy EncryptingCredentials en consecuencia.

    Importante

    De forma predeterminada, las TokenEncryptionRequired propiedades y SymmetricKeyEncryptionRequired se establecen true para impedir que el STS emita tokens que no sean seguros. Se recomienda que estas propiedades nunca se establezcan false en en un entorno de producción.

  • Determine la dirección a la que se debe devolver la respuesta. Establezca la AppliesToAddress propiedad o ReplyToAddress en consecuencia.

Notas a los implementadores

Debe reemplazar este método en la implementación de la clase SecurityTokenService.

Se aplica a

Consulte también