SecurityTokenService.GetScope(ClaimsPrincipal, RequestSecurityToken) Metoda

Definicja

Scope Pobiera obiekt zawierający informacje o jednostki uzależnionej skojarzonej z określonym żądaniem (RST). Tę metodę należy zastąpić w implementacji SecurityTokenService klasy .

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

Parametry

principal
ClaimsPrincipal

Element ClaimsPrincipal reprezentujący klienta wysyłającego żądanie.

request
RequestSecurityToken

Element RequestSecurityToken reprezentujący żądanie przychodzące (RST).

Zwraca

Element Scope , który hermetyzuje informacje o dostawcy usług skojarzone z żądaniem.

Przykłady

Przykładowy kod używany w tym temacie jest pobierany z przykładu Custom Token . Ten przykład zawiera niestandardowe klasy, które umożliwiają przetwarzanie prostych tokenów sieci Web (SWT) i obejmują implementację pasywnej usługi STS, która może obsługiwać token SWT. Przykład implementacji aktywnej usługi STS można znaleźć w przykładzie Federation Metadata . Aby uzyskać informacje o tych przykładach i innych przykładach dostępnych dla programu WIF oraz o tym, gdzie je pobrać, zobacz Przykładowy indeks kodu programu WIF.

Poniższy przykład kodu przedstawia implementację GetScope metody . Ta implementacja weryfikuje, czy dostawca usługi jest rozpoznawany przez usługę STS, weryfikuje ReplyTo adres w żądaniu i ustawia odpowiednio właściwość oraz ustawia Scope.ReplyToAddress podpisywanie i szyfrowanie poświadczeń do użycia z dostawcą usług na podstawie certyfikatów, które są zakodowane w pliku.

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

Uwagi

Metoda jest wywoływana GetScope z potoku wystawiania tokenów po ValidateRequest metodzie i powinna zwrócić Scope obiekt skonfigurowany dla żądania przychodzącego. (Potok wystawiania tokenu jest implementowany w metodzie Issue ). Scope Obiekt hermetyzuje informacje o rp skojarzone z żądaniem tokenu zabezpieczającego (RST). Obejmuje to informacje na temat szyfrowania i podpisywania poświadczeń do użycia z dostawcą usług i szyfrowania żadnych wystawionych tokenów i/lub kluczy symetrycznych w odpowiedzi. Niektóre typowe zadania wykonywane w metodzie GetScope to:

  • Określ, czy rp, dla którego jest przeznaczony token, jest rozpoznawanym dostawcą usług. W jaki sposób jest to realizowane, zależy od implementacji. Jeśli zamierzony element RP nie jest prawidłowym dostawcą usługi STS, metoda powinna zgłosić wartość InvalidRequestException.

  • Określ poświadczenia podpisywania, które mają być używane w odpowiedzi (RSTR) i ustaw SigningCredentials odpowiednio właściwość.

  • Ustal, czy odpowiedź i/lub jakiekolwiek dołączone klucze symetryczne powinny być szyfrowane, a poświadczenia, które mają być używane do szyfrowania. TokenEncryptionRequiredUstaw odpowiednio właściwości , SymmetricKeyEncryptionRequiredi EncryptingCredentials .

    Ważne

    Domyślnie właściwości i SymmetricKeyEncryptionRequired są ustawionetrue, TokenEncryptionRequired aby uniemożliwić usłudze STS wystawianie tokenów, które nie są bezpieczne. Zaleca się, aby te właściwości nigdy nie były ustawione w false środowisku produkcyjnym.

  • Określ adres, do którego powinna zostać zwrócona odpowiedź. AppliesToAddress Ustaw odpowiednio właściwość lubReplyToAddress.

Uwagi dotyczące implementowania

Tę metodę należy zastąpić w implementacji SecurityTokenService klasy .

Dotyczy

Zobacz też