Share via


SecurityTokenHandler.WriteToken Yöntem

Tanım

Türetilmiş bir sınıfta geçersiz kılındığında, belirtilen güvenlik belirtecini serileştirir. Belirteç, türetilen sınıf tarafından işlenen türden olmalıdır.

Aşırı Yüklemeler

WriteToken(SecurityToken)

Türetilmiş bir sınıfta geçersiz kılındığında, belirtilen güvenlik belirtecini bir dizeye serileştirir. Belirteç, türetilen sınıf tarafından işlenen türden olmalıdır.

WriteToken(XmlWriter, SecurityToken)

Türetilmiş bir sınıfta geçersiz kılındığında, belirtilen güvenlik belirtecini XML olarak serileştirir. Belirteç, türetilen sınıf tarafından işlenen türden olmalıdır.

WriteToken(SecurityToken)

Türetilmiş bir sınıfta geçersiz kılındığında, belirtilen güvenlik belirtecini bir dizeye serileştirir. Belirteç, türetilen sınıf tarafından işlenen türden olmalıdır.

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

Parametreler

token
SecurityToken

Serileştirecek belirteç.

Döndürülenler

Serileştirilmiş belirteç.

Açıklamalar

Varsayılan olarak bu yöntem bir NotImplementedException özel durum oluşturur.

Bir güvenlik belirtecini XML'ye seri hale getirme mantığını sağlamak için bu yöntemi geçersiz kılın. Bu yöntemi geçersiz kılarsanız, özelliğini de geçersiz kılmalısınız CanWriteToken .

Şunlara uygulanır

WriteToken(XmlWriter, SecurityToken)

Türetilmiş bir sınıfta geçersiz kılındığında, belirtilen güvenlik belirtecini XML olarak serileştirir. Belirteç, türetilen sınıf tarafından işlenen türden olmalıdır.

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)

Parametreler

writer
XmlWriter

XML yazıcısı.

token
SecurityToken

Serileştirecek belirteç.

Örnekler

Aşağıdaki kod, özel bir belirteci seri hale getirmek için yönteminin nasıl geçersiz kılınacak WriteToken olduğunu gösterir. Kod örnekten Custom Token alınır. Bu örnek, Basit Web Belirteçlerinin (SWT) işlenmesini sağlayan özel sınıflar sağlar. Bu örnek ve WIF için kullanılabilen diğer örnekler ve bunların nereden indirileceği hakkında bilgi için bkz. WIF Kod Örneği Dizini.

/// <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;
    }
}

Açıklamalar

Varsayılan olarak bu yöntem bir NotImplementedException özel durum oluşturur.

Bir güvenlik belirtecini XML'ye seri hale getirme mantığını sağlamak için bu yöntemi geçersiz kılın. Bu yöntemi geçersiz kılarsanız, özelliğini de geçersiz kılmalısınız CanWriteToken .

Şunlara uygulanır