SecurityTokenService クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
セキュリティ トークン サービス (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 |
所有者構成インスタンスを取得します。 |
メソッド
適用対象
こちらもご覧ください
.NET