Language

SecurityTokenService.GetScope(ClaimsPrincipal, RequestSecurityToken) メソッド

定義

指定した要求 (RST) に関連付けられている証明書利用者 (RP) に関する情報を含む Scope オブジェクトを取得します。 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

受信要求 (RST) を表す RequestSecurityToken 。

返品

要求に関連付けられている RP 情報をカプセル化する Scope 。

例

このトピックで使用するコード例は、 Custom Token サンプルから取得します。 このサンプルでは、Simple Web Tokens (SWT) の処理を可能にするカスタム クラスを提供します。これには、SWT トークンを提供できるパッシブ STS の実装が含まれています。 アクティブ STS を実装する方法の例については、 Federation Metadata サンプルを参照してください。 WIF で使用できるこれらのサンプルとその他のサンプルの詳細と、それらをダウンロードする場所については、 WIF コード サンプル インデックスを参照してください。

次のコード例は、 GetScope メソッドの実装を示しています。 この実装では、RP が STS によって認識されていることを確認し、要求の 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) に関連付けられている RP に関する情報をカプセル化します。 これには、RP で使用する暗号化資格情報と署名資格情報、および応答で発行されたトークンや対称キーを暗号化するかどうかに関する情報が含まれます。 GetScope メソッドで実行される一般的なタスクは次のとおりです。

  • トークンの対象となる RP が認識された RP であるかどうかを判断します。 これを実現する方法は、実装によって異なります。 目的の RP がこの STS に対して有効な RP でない場合、メソッドは InvalidRequestExceptionをスローする必要があります。

  • 応答 (RSTR) で使用する署名資格情報を決定し、それに応じて SigningCredentials プロパティを設定します。

  • 応答や含まれる対称キーを暗号化するかどうか、および暗号化に使用する資格情報を決定します。 それに応じて、 TokenEncryptionRequired、 SymmetricKeyEncryptionRequired、および EncryptingCredentials プロパティを設定します。

    Important

    既定では、STS がセキュリティで保護されていないトークンを発行できないように、 TokenEncryptionRequired プロパティと SymmetricKeyEncryptionRequired プロパティが true 設定されます。 運用環境では、これらのプロパティを false に設定しないでください。

  • 応答を返すアドレスを決定します。 それに応じて、 AppliesToAddress または ReplyToAddress プロパティを設定します。

注意 (実装者)

SecurityTokenService クラスの実装では、このメソッドをオーバーライドする必要があります。

適用対象

こちらもご覧ください