Share via


SecurityTokenHandler.WriteToken Méthode

Définition

En cas de substitution dans une classe dérivée, sérialise le jeton de sécurité spécifié. Le jeton doit être du type traité par la classe dérivée.

Surcharges

WriteToken(SecurityToken)

En cas de substitution dans une classe dérivée, sérialise le jeton de sécurité spécifié en chaîne. Le jeton doit être du type traité par la classe dérivée.

WriteToken(XmlWriter, SecurityToken)

En cas de substitution dans une classe dérivée, sérialise le jeton de sécurité spécifié au format XML. Le jeton doit être du type traité par la classe dérivée.

WriteToken(SecurityToken)

En cas de substitution dans une classe dérivée, sérialise le jeton de sécurité spécifié en chaîne. Le jeton doit être du type traité par la classe dérivée.

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

Paramètres

token
SecurityToken

Jeton à sérialiser.

Retours

Jeton sérialisé.

Remarques

Par défaut, cette méthode lève une NotImplementedException exception.

Remplacez cette méthode pour fournir la logique de sérialisation d’un jeton de sécurité au format XML. Si vous remplacez cette méthode, vous devez également remplacer la CanWriteToken propriété .

S’applique à

WriteToken(XmlWriter, SecurityToken)

En cas de substitution dans une classe dérivée, sérialise le jeton de sécurité spécifié au format XML. Le jeton doit être du type traité par la classe dérivée.

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)

Paramètres

writer
XmlWriter

Enregistreur XML.

token
SecurityToken

Jeton à sérialiser.

Exemples

Le code suivant montre comment remplacer la WriteToken méthode pour sérialiser un jeton personnalisé. Le code est extrait de l’exemple Custom Token . Cet exemple fournit des classes personnalisées qui permettent le traitement des jetons web simples (SWT). Pour plus d’informations sur cet exemple et d’autres exemples disponibles pour WIF et où les télécharger, consultez Index d’exemple de code 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;
    }
}

Remarques

Par défaut, cette méthode lève une NotImplementedException exception.

Remplacez cette méthode pour fournir la logique de sérialisation d’un jeton de sécurité au format XML. Si vous remplacez cette méthode, vous devez également remplacer la CanWriteToken propriété .

S’applique à