Sdílet prostřednictvím


SecurityTokenHandler.WriteToken Metoda

Definice

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.

Platí pro