【问题标题】:How to store/Deserialize/Serialize GenericXmlSecurityToken?如何存储/反序列化/序列化 GenericXmlSecurityToken?
【发布时间】:2016-12-15 17:17:10
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: c# token wif claims-based-identity adfs


    【解决方案1】:

    使用 System.IdentityModel,您可以将 GenericXmlSecurityToken 序列化为 Xml。以下是 Shawn Cicoria 的一篇文章,给出了如何执行此操作的示例:http://geekswithblogs.net/cicorias/archive/2012/03/22/getting-a-securitytoken-from-a-requestsecuritytokenresponse-in-wif.aspx

    鉴于序列化的令牌,您必须设计一种方法来保存它。

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

    【讨论】:

      【解决方案2】:

      如果你只想反序列化令牌,即初始化 WCF(我认为方法的名称类似于 create WithIssuedToken),你可以使用constructor of GenericXmlSecurityToken。仅使用 XmlElement tokenXml 参数并将其他参数保留为 null(或 DateTime 参数的某些默认值)

      var xmlToken = new GenericXmlSecurityToken(
              tokenXmlElement,
              null,
              DateTime.Now,
              DateTime.Now.AddHours(1),
              null,
              null,
              null);
      

      我应该注意,该实例将具有与现在反序列化的 SecurityToken 的实际值不对应的属性(如有效时间和过期时间)(因为您在构造函数中手动设置它们)。但是 WCF 会使用令牌中的真实信息,所以它会以这种方式工作。

      【讨论】:

      • 如果 AD FS 颁发的委托令牌是 base64 编码,然后在用于调用服务时以这种方式实例化,则此方法将不起作用。它“可能”与 ExternalTokenReference、InternalTokenReference 和 ProofToken 在这里为空有关,但我不确定。我知道在这种情况下会抛出以下错误: System.ServiceModel.Security.MessageSecurityException 无法创建令牌引用。但它确实适用于非委托代币。 (委托令牌是 AD FS 在身份委托期间发出的令牌。)
      猜你喜欢
      • 2019-08-20
      • 1970-01-01
      • 1970-01-01
      • 2017-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多