SecurityTokenHandler.WriteToken メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
派生クラスでオーバーライドされると、指定されたセキュリティ トークンをシリアル化します。 トークンは、派生クラスによって処理される種類である必要があります。
オーバーロード
WriteToken(SecurityToken) |
派生クラスでオーバーライドされると、指定されたセキュリティ トークンを文字列にシリアル化します。 トークンは、派生クラスによって処理される種類である必要があります。 |
WriteToken(XmlWriter, SecurityToken) |
派生クラスでオーバーライドされると、指定されたセキュリティ トークンを XML にシリアル化します。 トークンは、派生クラスによって処理される種類である必要があります。 |
WriteToken(SecurityToken)
派生クラスでオーバーライドされると、指定されたセキュリティ トークンを文字列にシリアル化します。 トークンは、派生クラスによって処理される種類である必要があります。
public:
virtual System::String ^ WriteToken(System::IdentityModel::Tokens::SecurityToken ^ token);
public virtual string WriteToken (System.IdentityModel.Tokens.SecurityToken token);
abstract member WriteToken : System.IdentityModel.Tokens.SecurityToken -> string
override this.WriteToken : System.IdentityModel.Tokens.SecurityToken -> string
Public Overridable Function WriteToken (token As SecurityToken) As String
パラメーター
- token
- SecurityToken
シリアル化するトークン。
戻り値
シリアル化されたトークン。
注釈
既定では、このメソッドは例外を NotImplementedException スローします。
セキュリティ トークンを XML にシリアル化するロジックを提供するには、このメソッドをオーバーライドします。 このメソッドをオーバーライドする場合は、 プロパティもオーバーライドする CanWriteToken 必要があります。
適用対象
WriteToken(XmlWriter, SecurityToken)
派生クラスでオーバーライドされると、指定されたセキュリティ トークンを XML にシリアル化します。 トークンは、派生クラスによって処理される種類である必要があります。
public:
virtual void WriteToken(System::Xml::XmlWriter ^ writer, System::IdentityModel::Tokens::SecurityToken ^ token);
public virtual void WriteToken (System.Xml.XmlWriter writer, System.IdentityModel.Tokens.SecurityToken token);
abstract member WriteToken : System.Xml.XmlWriter * System.IdentityModel.Tokens.SecurityToken -> unit
override this.WriteToken : System.Xml.XmlWriter * System.IdentityModel.Tokens.SecurityToken -> unit
Public Overridable Sub WriteToken (writer As XmlWriter, token As SecurityToken)
パラメーター
- writer
- XmlWriter
XML ライター。
- token
- SecurityToken
シリアル化するトークン。
例
次のコードは、 メソッドをオーバーライド WriteToken してカスタム トークンをシリアル化する方法を示しています。 コードはサンプルから取得されます Custom Token
。 このサンプルでは、Simple Web Tokens (SWT) の処理を有効にするカスタム クラスを提供します。 WIF で使用できるこのサンプルとその他のサンプルの詳細と、それらをダウンロードする場所については、「 WIF コード サンプル インデックス」を参照してください。
/// <summary>
/// Serializes the given SecurityToken to the XmlWriter.
/// </summary>
/// <param name="writer">XmlWriter into which the token is serialized.</param>
/// <param name="token">SecurityToken to be serialized.</param>
public override void WriteToken( XmlWriter writer, SecurityToken token )
{
SimpleWebToken simpleWebToken = token as SimpleWebToken;
if ( simpleWebToken == null )
{
throw new SecurityTokenException("The given token is not of the expected type 'SimpleWebToken'.");
}
string signedToken = null;
if ( String.IsNullOrEmpty( simpleWebToken.SerializedToken ) )
{
StringBuilder strBuilder = new StringBuilder();
bool skipDelimiter = true;
NameValueCollection tokenProperties = simpleWebToken.GetAllProperties();
// remove the signature if present
if ( String.IsNullOrEmpty( tokenProperties[SimpleWebTokenConstants.Signature] ) )
{
tokenProperties.Remove( SimpleWebTokenConstants.Signature );
}
foreach ( string key in tokenProperties.Keys )
{
if ( tokenProperties[key] != null )
{
if ( !skipDelimiter )
{
strBuilder.Append( ParameterSeparator );
}
strBuilder.Append( String.Format(
CultureInfo.InvariantCulture,
"{0}={1}",
HttpUtility.UrlEncode( key ),
HttpUtility.UrlEncode( tokenProperties[key] ) ) );
skipDelimiter = false;
}
}
string serializedToken = strBuilder.ToString();
SimpleWebTokenKeyIdentifierClause clause = new SimpleWebTokenKeyIdentifierClause(simpleWebToken.Audience);
InMemorySymmetricSecurityKey securityKey = null;
try
{
securityKey = (InMemorySymmetricSecurityKey)this.Configuration.IssuerTokenResolver.ResolveSecurityKey(clause);
}
catch (InvalidOperationException)
{
throw new SecurityTokenValidationException("A Symmetric key was not found for the given key identifier clause.");
}
// append the signature
string signature = GenerateSignature( serializedToken, securityKey.GetSymmetricKey() );
strBuilder.Append( String.Format(
CultureInfo.InvariantCulture,
"{0}{1}={2}",
ParameterSeparator,
HttpUtility.UrlEncode( SimpleWebTokenConstants.Signature ),
HttpUtility.UrlEncode( signature ) ) );
signedToken = strBuilder.ToString();
}
else
{
// reuse the stored serialized token if present
signedToken = simpleWebToken.SerializedToken;
}
string encodedToken = Convert.ToBase64String( Encoding.UTF8.GetBytes( signedToken ) );
writer.WriteStartElement(BinarySecurityToken);
writer.WriteAttributeString("Id", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", token.Id);
writer.WriteAttributeString( ValueType, SimpleWebTokenConstants.ValueTypeUri );
writer.WriteAttributeString( EncodingType, Base64EncodingType );
writer.WriteString( encodedToken );
writer.WriteEndElement();
}
/// <summary>
/// Generates an HMACSHA256 signature for a given string and key.
/// </summary>
/// <param name="unsignedToken">The token to be signed.</param>
/// <param name="signingKey">The key used to generate the signature.</param>
/// <returns>The generated signature.</returns>
protected static string GenerateSignature(string unsignedToken, byte[] signingKey)
{
using (HMACSHA256 hmac = new HMACSHA256(signingKey))
{
byte[] signatureBytes = hmac.ComputeHash(Encoding.ASCII.GetBytes(unsignedToken));
string signature = HttpUtility.UrlEncode(Convert.ToBase64String(signatureBytes));
return signature;
}
}
注釈
既定では、このメソッドは例外を NotImplementedException スローします。
セキュリティ トークンを XML にシリアル化するロジックを提供するには、このメソッドをオーバーライドします。 このメソッドをオーバーライドする場合は、 プロパティもオーバーライドする CanWriteToken 必要があります。
適用対象
.NET