SecurityTokenHandler.WriteToken Methode

Definitie

Wanneer dit wordt overschreven in een afgeleide klasse, serialiseert u het opgegeven beveiligingstoken. Het token moet van het type zijn dat door de afgeleide klasse wordt verwerkt.

Overloads

Name Description
WriteToken(SecurityToken)

Wanneer het in een afgeleide klasse wordt overschreven, serialiseert u het opgegeven beveiligingstoken naar een tekenreeks. Het token moet van het type zijn dat door de afgeleide klasse wordt verwerkt.

WriteToken(XmlWriter, SecurityToken)

Wanneer dit wordt overschreven in een afgeleide klasse, serialiseert u het opgegeven beveiligingstoken naar XML. Het token moet van het type zijn dat door de afgeleide klasse wordt verwerkt.

WriteToken(SecurityToken)

Wanneer het in een afgeleide klasse wordt overschreven, serialiseert u het opgegeven beveiligingstoken naar een tekenreeks. Het token moet van het type zijn dat door de afgeleide klasse wordt verwerkt.

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

Parameters

token
SecurityToken

Het token dat moet worden geserialiseerd.

Retouren

Het geserialiseerde token.

Opmerkingen

Deze methode genereert standaard een NotImplementedException uitzondering.

Overschrijf deze methode om de logica te bieden voor het serialiseren van een beveiligingstoken naar XML. Als u deze methode overschrijft, moet u ook de CanWriteToken eigenschap overschrijven.

Van toepassing op

WriteToken(XmlWriter, SecurityToken)

Wanneer dit wordt overschreven in een afgeleide klasse, serialiseert u het opgegeven beveiligingstoken naar XML. Het token moet van het type zijn dat door de afgeleide klasse wordt verwerkt.

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)

Parameters

writer
XmlWriter

De XML-schrijver.

token
SecurityToken

Het token dat moet worden geserialiseerd.

Voorbeelden

De volgende code laat zien hoe u de methode voor het WriteToken serialiseren van een aangepast token overschrijft. De code wordt uit het Custom Token voorbeeld genomen. Dit voorbeeld bevat aangepaste klassen waarmee eenvoudige webtokens (SWT) kunnen worden verwerkt. Zie de WIF-codevoorbeeldindex voor informatie over dit voorbeeld en andere voorbeelden die beschikbaar zijn voor WIF en waar u ze kunt downloaden.

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

Opmerkingen

Deze methode genereert standaard een NotImplementedException uitzondering.

Overschrijf deze methode om de logica te bieden voor het serialiseren van een beveiligingstoken naar XML. Als u deze methode overschrijft, moet u ook de CanWriteToken eigenschap overschrijven.

Van toepassing op