Поделиться через


SecurityTokenService.GetScope(ClaimsPrincipal, RequestSecurityToken) Метод

Определение

Получает объект Scope, содержащий информацию о проверяющей стороне (RP), связанной с указанным запросом (RST). Этот метод необходимо переопределить при реализации класса 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

Параметры

principal
ClaimsPrincipal

Объект ClaimsPrincipal, представляющий клиента, производящего запрос.

request
RequestSecurityToken

Объект RequestSecurityToken, представляющий входящий запрос (RST).

Возвращаемое значение

Объект Scope, предоставляющий оболочку сведения о PR, связанные с запросом.

Примеры

Пример кода, используемый в этом разделе, взят из Custom Token примера. Этот пример предоставляет пользовательские классы, обеспечивающие обработку простых веб-маркеров (SWT), и включает реализацию пассивной службы маркеров маркеров безопасности, которая может обслуживать маркер SWT. Пример реализации активной службы STS см. в этом Federation Metadata примере. Сведения об этих и других примерах, доступных для WIF, и о том, где их можно скачать, см. в разделе Пример индекса кода WIF.

В следующем примере кода показана реализация метода GetScope. Эта реализация проверяет, распознается ли поставщик службой маркеров маркеров доступности ReplyTo , проверяет адрес в запросе и задает Scope.ReplyToAddress свойство соответствующим образом, а также задает учетные данные для подписывания и шифрования для использования с RP на основе сертификатов, жестко заданных в файле.

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

Комментарии

Метод GetScope вызывается из конвейера выдачи маркеров после ValidateRequest метода и должен возвращать объект, настроенный Scope для входящего запроса. (Конвейер выдачи маркеров реализуется в методе Issue .) Объект Scope инкапсулирует сведения о поставщике ресурсов, связанных с запросом маркера безопасности (RST). Сюда входят сведения о учетных данных для шифрования и подписывания, используемых с проверяющей стороны, а также о том, следует ли шифровать выданные маркеры и (или) симметричные ключи в ответе. Ниже приведены некоторые типичные задачи, выполняемые в методе GetScope .

  • Определите, является ли поставщик, для которого предназначен маркер, распознанной поставщиком ресурсов. Способ выполнения зависит от реализации. Если предполагаемая RP не является допустимой для этой службы STS, метод должен вызвать исключение InvalidRequestException.

  • Определите учетные данные для подписи, которые будут использоваться в ответе (RSTR), и задайте SigningCredentials свойство соответствующим образом.

  • Определите, следует ли шифровать ответ и (или) любые включенные симметричные ключи, а также учетные данные, используемые для шифрования. TokenEncryptionRequiredЗадайте соответствующим образом свойства , SymmetricKeyEncryptionRequiredи EncryptingCredentials .

    Важно!

    По умолчанию свойства и SymmetricKeyEncryptionRequired задаются true таким образом, TokenEncryptionRequired чтобы служба маркеров безопасности не выпускала маркеры безопасности. Рекомендуется никогда не задавать для этих свойств значение false в рабочей среде.

  • Определите адрес, на который должен быть возвращен ответ. Задайте свойство AppliesToAddress или ReplyToAddress соответствующим образом.

Примечания для тех, кто реализует этот метод

Этот метод необходимо переопределить при реализации класса SecurityTokenService.

Применяется к

См. также раздел