Freigeben über


SecurityTokenHandler.WriteToken Methode

Definition

Serialisiert bei Überschreibung in einer abgeleiteten Klasse das angegebene Sicherheitstoken. Das Token muss von dem von der abgeleiteten Klasse verarbeiteten Typ sein.

Überlädt

WriteToken(SecurityToken)

Serialisiert bei Überschreibung in einer abgeleiteten Klasse das angegebene Sicherheitstoken in eine Zeichenfolge. Das Token muss von dem von der abgeleiteten Klasse verarbeiteten Typ sein.

WriteToken(XmlWriter, SecurityToken)

Serialisiert beim Überschreiben in einer abgeleiteten Klasse das angegebene Sicherheitstoken in XML. Das Token muss von dem von der abgeleiteten Klasse verarbeiteten Typ sein.

WriteToken(SecurityToken)

Serialisiert bei Überschreibung in einer abgeleiteten Klasse das angegebene Sicherheitstoken in eine Zeichenfolge. Das Token muss von dem von der abgeleiteten Klasse verarbeiteten Typ sein.

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 zu serialisierende Token

Gibt zurück

Der serialisierte Token.

Hinweise

Standardmäßig löst diese Methode eine Ausnahme aus NotImplementedException .

Überschreiben Sie diese Methode, um die Logik zum Serialisieren eines Sicherheitstokens in XML bereitzustellen. Wenn Sie diese Methode überschreiben, sollten Sie auch die CanWriteToken -Eigenschaft überschreiben.

Gilt für:

WriteToken(XmlWriter, SecurityToken)

Serialisiert beim Überschreiben in einer abgeleiteten Klasse das angegebene Sicherheitstoken in XML. Das Token muss von dem von der abgeleiteten Klasse verarbeiteten Typ sein.

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 zu serialisierende Token

Beispiele

Der folgende Code zeigt, wie Sie die WriteToken -Methode überschreiben, um ein benutzerdefiniertes Token zu serialisieren. Der Code stammt aus dem Custom Token Beispiel. Dieses Beispiel enthält benutzerdefinierte Klassen, die die Verarbeitung von Simple Web Token (SWT) ermöglichen. Informationen zu diesem Beispiel und anderen für WIF verfügbaren Beispielen sowie zu den Informationen zum Herunterladen finden Sie unter WIF-Codebeispielindex.

/// <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 Ausnahme aus NotImplementedException .

Überschreiben Sie diese Methode, um die Logik zum Serialisieren eines Sicherheitstokens in XML bereitzustellen. Wenn Sie diese Methode überschreiben, sollten Sie auch die CanWriteToken -Eigenschaft überschreiben.

Gilt für: