SecurityTokenHandler.WriteToken Methode
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
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.