SecurityTokenHandler.WriteToken Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Při přepsání v odvozené třídě serializuje zadaný token zabezpečení. Token musí být typu zpracovaného odvozenou třídou.
Přetížení
WriteToken(SecurityToken) |
Při přepsání v odvozené třídě serializuje zadaný token zabezpečení na řetězec. Token musí být typu zpracovaného odvozenou třídou. |
WriteToken(XmlWriter, SecurityToken) |
Při přepsání v odvozené třídě serializuje zadaný token zabezpečení do XML. Token musí být typu zpracovaného odvozenou třídou. |
WriteToken(SecurityToken)
Při přepsání v odvozené třídě serializuje zadaný token zabezpečení na řetězec. Token musí být typu zpracovaného odvozenou třídou.
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
Parametry
- token
- SecurityToken
Token pro serializaci.
Návraty
Serializovaný token.
Poznámky
Ve výchozím nastavení tato metoda vyvolá NotImplementedException výjimku.
Přepište tuto metodu tak, aby poskytla logiku serializace tokenu zabezpečení xml. Pokud tuto metodu přepíšete, měli byste také přepsat CanWriteToken vlastnost.
Platí pro
WriteToken(XmlWriter, SecurityToken)
Při přepsání v odvozené třídě serializuje zadaný token zabezpečení do XML. Token musí být typu zpracovaného odvozenou třídou.
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)
Parametry
- writer
- XmlWriter
Zapisovací modul XML
- token
- SecurityToken
Token pro serializaci.
Příklady
Následující kód ukazuje, jak přepsat metodu WriteToken serializace vlastního tokenu. Kód je převzat z ukázky Custom Token
. Tato ukázka obsahuje vlastní třídy, které umožňují zpracování jednoduchých webových tokenů (SWT). Informace o této ukázce a dalších ukázkách dostupných pro WIF a o tom, kde si je stáhnout, najdete v tématu Index ukázek kódu 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;
}
}
Poznámky
Ve výchozím nastavení tato metoda vyvolá NotImplementedException výjimku.
Přepište tuto metodu tak, aby poskytla logiku serializace tokenu zabezpečení xml. Pokud tuto metodu přepíšete, měli byste také přepsat CanWriteToken vlastnost.