C# 如何存储/反序列化/序列化GenericXmlSecurityToken?

C# 如何存储/反序列化/序列化GenericXmlSecurityToken?,c#,token,wif,claims-based-identity,adfs,C#,Token,Wif,Claims Based Identity,Adfs,我已经在c#中构建了一个winforms应用程序,从ADFS(windowsmixed)请求一个身份验证令牌,它工作正常,并且我得到了一个令牌。我正在使用WIF/ThinkTecture IdentityModel 在本地缓存/保存令牌,然后重新加载令牌(以便随后验证)的最佳方法是什么 我获得了一个GenericXmlSecurityToken对象形式的令牌。将其保存/缓存到文件,然后将其重新加载/序列化到新的GenericXmlSecurityToken对象中的最佳方法是什么 我可以将令牌转换

我已经在c#中构建了一个winforms应用程序,从ADFS(windowsmixed)请求一个身份验证令牌,它工作正常,并且我得到了一个令牌。我正在使用WIF/ThinkTecture IdentityModel

在本地缓存/保存令牌,然后重新加载令牌(以便随后验证)的最佳方法是什么

我获得了一个GenericXmlSecurityToken对象形式的令牌。将其保存/缓存到文件,然后将其重新加载/序列化到新的GenericXmlSecurityToken对象中的最佳方法是什么

我可以将令牌转换为字符串并保存:

string strToken = ((GenericXmlSecurityToken)genericToken).TokenXml.OuterXml;

但我不确定如何将此字符串重新序列化为GenericXmlSecurityToken,或者即使这是最好的方法(我知道将令牌保存到磁盘时需要额外的安全性,这是未来的任务)。

使用System.IdentityModel,您可以将GenericXmlSecurityToken序列化为Xml。以下是Shawn Cicoria的一篇文章,给出了如何做到这一点的示例:

给定序列化的令牌,您必须想出一种保存它的方法

注:
如果您还没有System.IdentityModel和System.IdentityModel.Services,请添加对它们的引用。

如果您只想使用反序列化令牌来初始化WCF(我认为该方法的名称类似于create WithIssuedToken),您可以直接使用。仅使用
xmlement-tokenXml
参数,并将其他参数保留为null(或DateTime参数的一些默认值)


我应该注意,该实例的属性(如effectiveTime和expirationTime)将与现在正在进行反序列化的SecurityToken的实际值不对应(因为您在构造函数中手动设置了它们)。但是WCF将使用令牌中的真实信息,因此它将以这种方式工作。

如果AD FS发布的委托令牌是base64编码的,然后在用于调用服务时以这种方式实例化,则这将不起作用。它“可能”与ExternalTokenReference、InternalTokenReference和ProofToken在这里为null有关,但我不确定。我知道在此场景中将引发以下错误:System.ServiceModel.Security.MessageSecurityException无法创建令牌引用。但对于非委托令牌,它确实可以很好地工作。(委派令牌是AD FS在身份委派期间颁发的令牌。)
var xmlToken = new GenericXmlSecurityToken(
        tokenXmlElement,
        null,
        DateTime.Now,
        DateTime.Now.AddHours(1),
        null,
        null,
        null);