Bagikan melalui


SecurityTokenHandler.WriteToken Metode

Definisi

Ketika ditimpa di kelas turunan, menserialisasikan token keamanan yang ditentukan. Token harus dari jenis yang diproses oleh kelas turunan.

Overload

WriteToken(SecurityToken)

Saat ditimpa di kelas turunan, menserialisasikan token keamanan yang ditentukan ke string. Token harus dari jenis yang diproses oleh kelas turunan.

WriteToken(XmlWriter, SecurityToken)

Saat ditimpa di kelas turunan, menserialisasikan token keamanan yang ditentukan ke XML. Token harus dari jenis yang diproses oleh kelas turunan.

WriteToken(SecurityToken)

Saat ditimpa di kelas turunan, menserialisasikan token keamanan yang ditentukan ke string. Token harus dari jenis yang diproses oleh kelas turunan.

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

Token untuk diserialisasikan.

Mengembalikan

Token berseri.

Keterangan

Secara default metode ini memberikan NotImplementedException pengecualian.

Ambil alih metode ini untuk menyediakan logika untuk membuat serial token keamanan ke XML. Jika Anda mengambil alih metode ini, Anda juga harus mengambil CanWriteToken alih properti .

Berlaku untuk

WriteToken(XmlWriter, SecurityToken)

Saat ditimpa di kelas turunan, menserialisasikan token keamanan yang ditentukan ke XML. Token harus dari jenis yang diproses oleh kelas turunan.

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

Penulis XML.

token
SecurityToken

Token untuk diserialisasikan.

Contoh

Kode berikut menunjukkan cara mengambil WriteToken alih metode untuk membuat serial token kustom. Kode diambil dari Custom Token sampel. Sampel ini menyediakan kelas kustom yang memungkinkan pemrosesan Simple Web Tokens (SWT). Untuk informasi tentang sampel ini dan sampel lain yang tersedia untuk WIF dan tempat mengunduhnya, lihat Indeks Sampel Kode 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;
    }
}

Keterangan

Secara default metode ini memberikan NotImplementedException pengecualian.

Ambil alih metode ini untuk menyediakan logika untuk membuat serial token keamanan ke XML. Jika Anda mengambil alih metode ini, Anda juga harus mengambil CanWriteToken alih properti .

Berlaku untuk