次の方法で共有


SecurityTokenService クラス

定義

セキュリティ トークン サービス (STS) のプロパティとメソッドを定義する抽象基本クラス。

public ref class SecurityTokenService abstract
public abstract class SecurityTokenService
type SecurityTokenService = class
Public MustInherit Class SecurityTokenService
継承
SecurityTokenService

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

using System;
using System.IdentityModel;
using System.IdentityModel.Configuration;
using System.IdentityModel.Protocols.WSTrust;
using System.IdentityModel.Tokens;
using System.Security.Claims;
using System.Security.Cryptography.X509Certificates;

namespace PassiveSTS
{
    /// <summary>
    /// Overrides the SecurityTokenService class to provide
    /// the relying party related information, such as encryption credentials to encrypt the issued
    /// token, signing credentials to sign the issued token, claims that the STS wants to issue for a 
    /// certain token request, as well as the claim types that this STS is capable
    /// of issuing.
    /// </summary>
    public class CustomSecurityTokenService : SecurityTokenService
    {
        // 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/";
        public CustomSecurityTokenService(SecurityTokenServiceConfiguration configuration)
            : base(configuration)
        {
            // Setup the certificate our STS is going to use to sign the issued tokens
            _signingCreds = new X509SigningCredentials(CertificateUtil.GetCertificate(StoreName.My, StoreLocation.LocalMachine, SIGNING_CERTIFICATE_NAME));

            // Note: In this sample app only a si   ngle 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
            _encryptingCreds = new X509EncryptingCredentials(CertificateUtil.GetCertificate(StoreName.My, StoreLocation.LocalMachine, ENCRYPTING_CERTIFICATE_NAME));
        }

        /// <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>
        /// This method returns the content of the issued token. The content is represented as a set of
        /// IClaimIdentity intances, each instance corresponds to a single issued token. Currently, the Windows Identity Foundation only
        /// supports a single token issuance, so the returned collection must always contain only a single instance.
        /// </summary>
        /// <param name="scope">The scope that was previously returned by GetScope method</param>
        /// <param name="principal">The caller's principal</param>
        /// <param name="request">The incoming RST, we don't use this in our implementation</param>
        /// <returns></returns>
        protected override ClaimsIdentity GetOutputClaimsIdentity( ClaimsPrincipal principal, RequestSecurityToken request, Scope scope )
        {
            //
            // Return a default claim set which contains a custom decision claim
            // Here you can actually examine the user by looking at the IClaimsPrincipal and 
            // return the right decision based on that. 
            //
            ClaimsIdentity outgoingIdentity = new ClaimsIdentity();
            outgoingIdentity.AddClaims(principal.Claims);

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

    }
}

次のコードは、カスタムパッシブ STS を呼び出して、ファイル内の分離コードから メソッドを呼び出 FederatedPassiveSecurityTokenServiceOperations.ProcessRequest(HttpRequest, ClaimsPrincipal, SecurityTokenService, HttpResponse) して WS-Federation 要求を処理する方法を default.aspx.cs 示しています。

using System;
using System.IdentityModel.Services;
using System.Security.Claims;

namespace PassiveSTS
{
    public partial class _Default : System.Web.UI.Page
    {
        /// <summary>
        /// We perform the WS-Federation Passive Protocol processing in this method. 
        /// </summary>
        protected void Page_PreRender( object sender, EventArgs e ) 
        {
            FederatedPassiveSecurityTokenServiceOperations.ProcessRequest( Request, User as ClaimsPrincipal, CustomSecurityTokenServiceConfiguration.Current.CreateSecurityTokenService(), Response );
        }
    }
}

注釈

STS を作成するには、 クラスから派生する SecurityTokenService 必要があります。 カスタム クラスでは、少なくとも メソッドと GetOutputClaimsIdentity メソッドをGetScopeオーバーライドする必要があります。 これらのオーバーライドを使用すると、クラスで定義されている他のすべてのメソッドの既定の実装を使用して作成された STS は、セキュリティ トークン要求 (RST) に応答してセキュリティ トークンを発行できます。 つまり、WS-Trust 仕様で定義されている Issue バインディングが実装されます。 このバインディングは、 メソッドに Issue 実装されます。 既定のケースでは、他の WS-Trust バインド (Renew、Cancel、Validate) は実装されておらず、これらのバインディングのいずれかに対応する RST が検出された場合、適切なエラーが呼び出し元に返されます。 もちろん、適切なメソッド (Renew、、) Validateをオーバーライドして、CancelSTS にこれらのバインディングを実装できます。

重要

運用対応 STS の実装には、このようなサービスの公開に固有の潜在的なセキュリティ リスクを軽減するために、慎重な計画とかなりのリソースが必要です。 Windows Identity Foundation (WIF) を使用するほとんどの開発者は、STS 自体を開発するのではなく、ID 管理を STS にアウトソーシングするアプリケーションを開発します。 WIF には Visual Studio 拡張機能である Identity and Access Tool for Visual Studio 2012 が用意されており、開発者が開発環境でソリューションをテストするのに役立ちます。 このツールには、 LocalSTS開発しているアプリケーションに特定の要求を提供するように構成できる STS が含まれています。 ID とアクセス ツールの詳細については、「 Identity and Access Tool for Visual Studio 2012」を参照してください。 シナリオによっては、 LocalSTS アプリケーションを適切にテストするために必要な機能が提供されない場合があります。たとえば、アプリケーションで使用するカスタム トークン ハンドラーを開発するシナリオなどです。 このような場合は、 から SecurityTokenService 派生して、開発環境にデプロイでき、アプリケーションでこのような機能をテストするために使用できる 1 つ以上の単純な STS を作成できます。 このセクションの残りの部分では、 クラスによって SecurityTokenService 公開されるメソッドに焦点を当てます。これにより、単純な STS を実装し、トークン発行パイプラインを拡張できます。

次の一覧は、テスト環境または開発環境で使用するために開発者にとって最も重要な方法の概要を示しています。

  • GetScope メソッド。 このメソッドは、RP に Scope 関する情報を含む オブジェクトを返します。 このオブジェクトは、トークン発行パイプラインの残りの部分で使用され、応答で使用する署名と暗号化の資格情報に関する情報、 AppliesTo および ReplyTo (必要な場合) アドレスが含まれます。 このメソッドをオーバーライドする必要があります。

  • GetOutputClaimsIdentity メソッド。 このメソッドは、RP に ClaimsIdentity 返す要求を含む オブジェクトを返します。 このメソッドをオーバーライドする必要があります。

  • Issue メソッド。 このメソッドは、受信セキュリティ トークン要求 (RST) を処理し、RP で認証するために使用できるトークンを含む応答 (RSTR) を呼び出し元に返すトークン要求パイプラインを実装します。 クラスでSecurityTokenService定義されている他のメソッドの多くは、 メソッドや GetOutputClaimsIdentity メソッドなどGetScope、このメソッドから呼び出されます。 このメソッドをオーバーライドする必要はありませんが、実装するトークン要求パイプラインを理解しておくと役立つ場合があります。

STS は、 クラスを使用して構成されます SecurityTokenServiceConfiguration

注意 (実装者)

メソッドと メソッドの両方を GetScope(ClaimsPrincipal, RequestSecurityToken) オーバーライドする GetOutputClaimsIdentity(ClaimsPrincipal, RequestSecurityToken, Scope) 必要があります。

コンストラクター

SecurityTokenService(SecurityTokenServiceConfiguration)

指定した構成設定を使用して SecurityTokenService クラスを初期化するために、派生クラスから呼び出されます。

プロパティ

Principal

現在のインスタンスに関連付けられたプリンシパルを取得または設定します。

Request

現在のインスタンスに関連付けられたセキュリティ トークン要求 (RST) を取得または設定します。

Scope

現在のインスタンスに関連付けられたスコープを取得または設定します。

SecurityTokenDescriptor

現在のインスタンスに関連付けられた SecurityTokenDescriptor を取得または設定します。

SecurityTokenServiceConfiguration

所有者構成インスタンスを取得します。

メソッド

BeginCancel(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object)

派生クラスでオーバーライドされると、非同期の WS-Trust Cancel 要求を開始します。

BeginGetOutputClaimsIdentity(ClaimsPrincipal, RequestSecurityToken, Scope, AsyncCallback, Object)

派生クラスでオーバーライドされると、GetOutputClaimsIdentity(ClaimsPrincipal, RequestSecurityToken, Scope) メソッドへの非同期呼び出しを開始します。

BeginGetScope(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object)

派生クラスでオーバーライドされると、GetScope(ClaimsPrincipal, RequestSecurityToken) メソッドへの非同期呼び出しを開始します。

BeginIssue(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object)

派生クラスでオーバーライドされると、非同期の WS-Trust Issue 要求を開始します。

BeginRenew(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object)

派生クラスでオーバーライドされると、非同期の WS-Trust Renew 要求を開始します。

BeginValidate(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object)

派生クラスでオーバーライドされると、非同期の WS-Trust Validate 要求を開始します。

Cancel(ClaimsPrincipal, RequestSecurityToken)

派生クラスでオーバーライドされると、WS-Trust Cancel 要求を処理します。

CreateSecurityTokenDescriptor(RequestSecurityToken, Scope)

SecurityTokenDescriptor のインスタンスを作成します。

EndCancel(IAsyncResult)

派生クラスでオーバーライドされると、非同期の WS-Trust Cancel 要求を完了します。

EndGetOutputClaimsIdentity(IAsyncResult)

派生クラスでオーバーライドされると、BeginGetOutputClaimsIdentity(ClaimsPrincipal, RequestSecurityToken, Scope, AsyncCallback, Object) メソッドへの非同期呼び出しを完了します。

EndGetScope(IAsyncResult)

派生クラスでオーバーライドされると、BeginGetScope(ClaimsPrincipal, RequestSecurityToken, AsyncCallback, Object) メソッドへの非同期呼び出しを完了します。

EndIssue(IAsyncResult)

派生クラスでオーバーライドされると、非同期の WS-Trust Issue 要求を完了します。

EndRenew(IAsyncResult)

派生クラスでオーバーライドされると、非同期の WS-Trust Renew 要求を完了します。

EndValidate(IAsyncResult)

派生クラスでオーバーライドされると、非同期の WS-Trust Validate 要求を完了します。

Equals(Object)

指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判断します。

(継承元 Object)
GetHashCode()

既定のハッシュ関数として機能します。

(継承元 Object)
GetIssuerName()

セキュリティ トークン サービス (STS) の名前を取得します。

GetOutputClaimsIdentity(ClaimsPrincipal, RequestSecurityToken, Scope)

この派生クラスでオーバーライドされると、このメソッドは、発行済みトークンに含まれる出力サブジェクトのコレクションを返します。

GetProofToken(RequestSecurityToken, Scope)

応答 (RSTR) に含まれる証明トークンを取得します。

GetRequestorProofEncryptingCredentials(RequestSecurityToken)

要求元の証明暗号化の資格情報を取得します。

GetResponse(RequestSecurityToken, SecurityTokenDescriptor)

指定した要求 (RST) およびセキュリティ トークン記述子を使用して発行されたトークンを含む応答 (RSTR) を作成します。

GetScope(ClaimsPrincipal, RequestSecurityToken)

指定したリクエスト (RST) と関連付けられている証明書利用者 (RP) に関する情報を含む Scope オブジェクトを取得します。 このメソッドは、SecurityTokenService クラスの実装でオーバーライドする必要があります。

GetSecurityTokenHandler(String)

指定した種類のセキュリティ トークンを発行するための適切なセキュリティ トークン ハンドラーを取得します。

GetTokenLifetime(Lifetime)

発行済みトークンの有効期間を取得します。

GetType()

現在のインスタンスの Type を取得します。

(継承元 Object)
Issue(ClaimsPrincipal, RequestSecurityToken)

セキュリティ トークンを発行します。

MemberwiseClone()

現在の Object の簡易コピーを作成します。

(継承元 Object)
Renew(ClaimsPrincipal, RequestSecurityToken)

派生クラスでオーバーライドされると、WS-Trust Renew 要求を処理します。

ToString()

現在のオブジェクトを表す文字列を返します。

(継承元 Object)
Validate(ClaimsPrincipal, RequestSecurityToken)

派生クラスでオーバーライドされると、WS-Trust Validate 要求を処理します。

ValidateRequest(RequestSecurityToken)

このインスタンスによってカプセル化されたセキュリティ トークン要求 (RST) を検証します。

適用対象

こちらもご覧ください