SecurityTokenHandler.ReadToken 方法

定义

当在派生类中重写时,由派生类反序列化类型处理的指定 XML。

重载

ReadToken(String)

当在派生类中重写时,由派生类反序列化类型处理的指定字符串。

ReadToken(XmlReader)

当在派生类中重写时,使用指定 XML 读取器将 XML 引用的反序列化为由该类处理的类型的标记。

ReadToken(XmlReader, SecurityTokenResolver)

当在派生类中重写时,由指定的 XML 读取器使用指定的标记解析器处理派生类类型的标记引用的 XML 进行反序列化。

ReadToken(String)

当在派生类中重写时,由派生类反序列化类型处理的指定字符串。

public:
 virtual System::IdentityModel::Tokens::SecurityToken ^ ReadToken(System::String ^ tokenString);
public virtual System.IdentityModel.Tokens.SecurityToken ReadToken (string tokenString);
abstract member ReadToken : string -> System.IdentityModel.Tokens.SecurityToken
override this.ReadToken : string -> System.IdentityModel.Tokens.SecurityToken
Public Overridable Function ReadToken (tokenString As String) As SecurityToken

参数

tokenString
String

要进行反序列化的字符串。

返回

从指定字符串反序列化的安全标记。

注解

重要

使用不受信任的数据调用此方法存在安全风险。 仅使用受信任的数据调用此方法。 有关详细信息,请参阅 验证所有输入

默认情况下,此方法引发 NotImplementedException 异常。

重写此方法以提供可从字符串反序列化安全令牌的功能。 如果重写此方法,则还应重写 SecurityTokenHandler.CanReadToken 方法。

适用于

ReadToken(XmlReader)

当在派生类中重写时,使用指定 XML 读取器将 XML 引用的反序列化为由该类处理的类型的标记。

public:
 virtual System::IdentityModel::Tokens::SecurityToken ^ ReadToken(System::Xml::XmlReader ^ reader);
public virtual System.IdentityModel.Tokens.SecurityToken ReadToken (System.Xml.XmlReader reader);
abstract member ReadToken : System.Xml.XmlReader -> System.IdentityModel.Tokens.SecurityToken
override this.ReadToken : System.Xml.XmlReader -> System.IdentityModel.Tokens.SecurityToken
Public Overridable Function ReadToken (reader As XmlReader) As SecurityToken

参数

reader
XmlReader

在标记的开始元素上指定的 XML 读取器。

返回

从 XML 反序列化的安全令牌。

示例

以下代码演示如何重写 方法以 ReadToken 从指定的 XML 读取器读取自定义令牌。 代码取自示例 Custom Token 。 此示例提供自定义类,这些类支持处理简单 Web 令牌 (SWT) 。 有关此示例和可用于 WIF 的其他示例及其下载位置的信息,请参阅 WIF 代码示例索引

/// <summary>
/// Reads a serialized token and converts it into a <see cref="SecurityToken"/>.
/// </summary>
/// <param name="reader">An XML reader positioned at the token's start element.</param>
/// <returns>The parsed form of the token.</returns>
public override SecurityToken ReadToken( XmlReader reader )
{
    if ( reader == null )
    {
        throw new ArgumentNullException( "reader" );
    }

    XmlDictionaryReader dictionaryReader = XmlDictionaryReader.CreateDictionaryReader(reader);

    byte[] binaryData;
    string encoding = dictionaryReader.GetAttribute( EncodingType );
    if ( encoding == null || encoding == Base64EncodingType )
    {
        dictionaryReader.Read();
        binaryData = dictionaryReader.ReadContentAsBase64();
    }
    else
    {
        throw new SecurityTokenException(
            "Cannot read SecurityToken as its encoding is" + encoding + ". Expected a BinarySecurityToken with base64 encoding.");
    }
    
    string serializedToken = Encoding.UTF8.GetString(binaryData);

    return ReadSecurityTokenFromString(serializedToken);
}
/// <summary>
/// Parse the string token and generates a <see cref="SecurityToken"/>.
/// </summary>
/// <param name="serializedToken">The serialized form of the token received.</param>
/// <returns>The parsed form of the token.</returns>
protected SecurityToken ReadSecurityTokenFromString( string serializedToken )
{
    if (String.IsNullOrEmpty(serializedToken))
    {
        throw new ArgumentException("The parameter 'serializedToken' cannot be null or empty string.");
    }

    // Create a collection of SWT name value pairs
    NameValueCollection properties = ParseToken( serializedToken );
    SimpleWebToken swt = new SimpleWebToken( properties, serializedToken );

    return swt;
}
/// <summary>
/// Parses the token into a collection.
/// </summary>
/// <param name="encodedToken">The serialized token.</param>
/// <returns>A colleciton of all name-value pairs from the token.</returns>
NameValueCollection ParseToken( string encodedToken )
{
    if ( String.IsNullOrEmpty( encodedToken ) )
    {
        throw new ArgumentException( "The parameter 'encodedToken' cannot be null or empty string.");
    }

    NameValueCollection keyValuePairs = new NameValueCollection();
    foreach ( string nameValue in encodedToken.Split( ParameterSeparator ) )
    {
        string[] keyValueArray = nameValue.Split( '=' );

        if ( ( keyValueArray.Length < 2 ) || String.IsNullOrEmpty( keyValueArray[0] ) )
        {
            throw new SecurityTokenException("The incoming token was not in an expected format.");
        }

        // Names must be decoded for the claim type case
        string key = HttpUtility.UrlDecode( keyValueArray[0].Trim() );

        // remove any unwanted "
        string value = HttpUtility.UrlDecode( keyValueArray[1].Trim().Trim( '"' ) ); 
        keyValuePairs.Add( key, value );
    }

    return keyValuePairs;
}

注解

重要

使用不受信任的数据调用此方法存在安全风险。 仅使用受信任的数据调用此方法。 有关详细信息,请参阅 验证所有输入

默认情况下,此方法引发 NotImplementedException 异常。

重写此方法以提供从 XML 反序列化安全令牌的逻辑。 如果重写此方法,则还应重写 SecurityTokenHandler.CanReadToken 方法。 通常,在派生类中,如果 方法无法从引用的 XML 反序列化令牌,则会引发 XmlException

适用于

ReadToken(XmlReader, SecurityTokenResolver)

当在派生类中重写时,由指定的 XML 读取器使用指定的标记解析器处理派生类类型的标记引用的 XML 进行反序列化。

public:
 virtual System::IdentityModel::Tokens::SecurityToken ^ ReadToken(System::Xml::XmlReader ^ reader, System::IdentityModel::Selectors::SecurityTokenResolver ^ tokenResolver);
public virtual System.IdentityModel.Tokens.SecurityToken ReadToken (System.Xml.XmlReader reader, System.IdentityModel.Selectors.SecurityTokenResolver tokenResolver);
abstract member ReadToken : System.Xml.XmlReader * System.IdentityModel.Selectors.SecurityTokenResolver -> System.IdentityModel.Tokens.SecurityToken
override this.ReadToken : System.Xml.XmlReader * System.IdentityModel.Selectors.SecurityTokenResolver -> System.IdentityModel.Tokens.SecurityToken
Public Overridable Function ReadToken (reader As XmlReader, tokenResolver As SecurityTokenResolver) As SecurityToken

参数

reader
XmlReader

在标记的开始元素上指定的 XML 读取器。

tokenResolver
SecurityTokenResolver

包含带外和已缓存的标志的标志的解析器。

返回

从 XML 反序列化的安全令牌。

注解

重要

使用不受信任的数据调用此方法存在安全风险。 仅使用受信任的数据调用此方法。 有关详细信息,请参阅 验证所有输入

默认实现忽略 参数, tokenResolver 并将调用委托给 SecurityTokenHandler.ReadToken 方法。

重写此方法以提供从 XML 反序列化安全令牌的逻辑。 如果重写此方法,则还应重写 SecurityTokenHandler.CanReadToken 方法。 通常,在派生类中,如果 方法无法从引用的 XML 反序列化令牌,则会引发 XmlException

适用于