SecurityTokenHandler.WriteToken Método
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Cuando se reemplaza en una clase derivada, serializa el token de seguridad especificado. El token debe ser del tipo procesado por la clase derivada.
Sobrecargas
WriteToken(SecurityToken) |
Cuando se reemplaza en una clase derivada, serializa el token de seguridad especificado en una cadena. El token debe ser del tipo procesado por la clase derivada. |
WriteToken(XmlWriter, SecurityToken) |
Cuando se reemplaza en una clase derivada, serializa el token de seguridad especificado en XML. El token debe ser del tipo procesado por la clase derivada. |
WriteToken(SecurityToken)
Cuando se reemplaza en una clase derivada, serializa el token de seguridad especificado en una cadena. El token debe ser del tipo procesado por la clase derivada.
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
Parámetros
- token
- SecurityToken
Token que se va a serializar.
Devoluciones
Token que se va a serializar.
Comentarios
De forma predeterminada, este método produce una NotImplementedException excepción.
Invalide este método para proporcionar la lógica para serializar un token de seguridad en XML. Si invalida este método, también debe invalidar la CanWriteToken propiedad .
Se aplica a
WriteToken(XmlWriter, SecurityToken)
Cuando se reemplaza en una clase derivada, serializa el token de seguridad especificado en XML. El token debe ser del tipo procesado por la clase derivada.
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)
Parámetros
- writer
- XmlWriter
Sistema de escritura XML.
- token
- SecurityToken
Token que se va a serializar.
Ejemplos
En el código siguiente se muestra cómo invalidar el WriteToken método para serializar un token personalizado. El código se toma del Custom Token
ejemplo. En este ejemplo se proporcionan clases personalizadas que permiten el procesamiento de tokens web simples (SWT). Para obtener información sobre este ejemplo y otros ejemplos disponibles para WIF y dónde descargarlos, consulte Índice de ejemplo de código 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;
}
}
Comentarios
De forma predeterminada, este método produce una NotImplementedException excepción.
Invalide este método para proporcionar la lógica para serializar un token de seguridad en XML. Si invalida este método, también debe invalidar la CanWriteToken propiedad .