SecurityTokenHandler.ReadToken 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
当在派生类中重写时,由派生类反序列化类型处理的指定 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。