SecurityTokenHandler.WriteToken Methode
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Beim Überschreiben in einer abgeleiteten Klasse serialisiert das angegebene Sicherheitstoken. Das Token muss vom Typ sein, der von der abgeleiteten Klasse verarbeitet wird.
Überlädt
| Name | Beschreibung |
|---|---|
| WriteToken(SecurityToken) |
Beim Überschreiben in einer abgeleiteten Klasse serialisiert das angegebene Sicherheitstoken in eine Zeichenfolge. Das Token muss vom Typ sein, der von der abgeleiteten Klasse verarbeitet wird. |
| WriteToken(XmlWriter, SecurityToken) |
Wenn sie in einer abgeleiteten Klasse außer Kraft gesetzt wird, serialisiert das angegebene Sicherheitstoken in XML. Das Token muss vom Typ sein, der von der abgeleiteten Klasse verarbeitet wird. |
WriteToken(SecurityToken)
Beim Überschreiben in einer abgeleiteten Klasse serialisiert das angegebene Sicherheitstoken in eine Zeichenfolge. Das Token muss vom Typ sein, der von der abgeleiteten Klasse verarbeitet wird.
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
Parameter
- token
- SecurityToken
Das token, das serialisiert werden soll.
Gibt zurück
Das serialisierte Token.
Hinweise
Standardmäßig löst diese Methode eine NotImplementedException Ausnahme aus.
Überschreiben Sie diese Methode, um die Logik zum Serialisieren eines Sicherheitstokens in XML bereitzustellen. Wenn Sie diese Methode außer Kraft setzen, sollten Sie die CanWriteToken Eigenschaft auch überschreiben.
Gilt für:
WriteToken(XmlWriter, SecurityToken)
Wenn sie in einer abgeleiteten Klasse außer Kraft gesetzt wird, serialisiert das angegebene Sicherheitstoken in XML. Das Token muss vom Typ sein, der von der abgeleiteten Klasse verarbeitet wird.
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)
Parameter
- writer
- XmlWriter
Der XML-Writer.
- token
- SecurityToken
Das token, das serialisiert werden soll.
Beispiele
Der folgende Code zeigt, wie Die WriteToken Methode zum Serialisieren eines benutzerdefinierten Tokens überschreibt. Der Code stammt aus dem Custom Token Beispiel. Dieses Beispiel enthält benutzerdefinierte Klassen, die die Verarbeitung einfacher Webtoken (SIMPLE Web Tokens, SWT) ermöglichen. Informationen zu diesem Beispiel und anderen Beispielen, die für WIF verfügbar sind und wo sie heruntergeladen werden sollen, finden Sie unter WIF Code Sample Index.
/// <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;
}
}
Hinweise
Standardmäßig löst diese Methode eine NotImplementedException Ausnahme aus.
Überschreiben Sie diese Methode, um die Logik zum Serialisieren eines Sicherheitstokens in XML bereitzustellen. Wenn Sie diese Methode außer Kraft setzen, sollten Sie die CanWriteToken Eigenschaft auch überschreiben.