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
範例。 此範例提供自定義類別,可讓您處理簡單 Web 令牌 (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 屬性。