将Owin从3.0.0更新到3.0.1后,旧令牌停止工作

时间:2015-05-06 10:48:16

标签: c# asp.net asp.net-web-api owin

我在我的WebApi项目中将Owin nuget软件包从3.0.0更新到3.0.1,但在更新之后,旧版本生成并保存在客户端的所有用户令牌都停止了新部署。< / p>

是否有办法让旧用户令牌使用新版本,否则所有用户都需要再次登录系统以获取新的访问令牌,我想避免这种情况。

2 个答案:

答案 0 :(得分:1)

3.0.0和3.0.1之间的不兼容性是由于Microsoft.Owin.Security.DataHandler.Serializer.TokenSerializer类的3.0.0版本中的错误造成的。此类具有私有常量FormatVersion,表示令牌格式的版本。在TokenSerializer.Read()中检查此值,并拒绝任何没有匹配格式版本的令牌。

在框架的2.x版本中,FormatVersion的值为2.框架发布的标记格式在版本2.x和3.0.0之间发生了变化,但似乎Microsoft忘记更新值FormatVersion。他们最终在3.0.1中更新了它,但当然导致3.0.0中发布的令牌在3.0.1中被拒绝,因为FormatVersion不再匹配。

您可以在https://katanaproject.codeplex.com/workitem/347看到有关2.x和3.0.0之间格式更改的讨论,您可以在{{3)看到破坏3.0.0和3.0.1之间兼容性的提交}}

好消息是3.0.0和3.0.1之间的安全实现似乎没有任何其他重大差异,并且看起来有一种方法可以让这一切全部恢复正常。 Katana项目是开源的,因此您可以构建自己的3.0.1版本,该版本可以解决这个问题。您要进行的更改位于TokenSerializer.Read(),以便在其版本为2或3时接受令牌。

这使得有点棘手的是Microsoft.Owin包被强名称,因此引用它们的任何内容也需要更新以显式引用您的自定义构建。因此,您真的只需要直接受TokenSerializer更改影响的Microsoft.Owin。*库的自定义构建,否则您将给自己做很多不必要的工作。就我而言,我发现我真正关心的库是Microsoft.Owin.SecurityMicrosoft.Owin.Security.OAuthMicrosoft.Owin.Security.Jwt。特别是,您需要避免自定义构建Microsoft.Owin,因为其他库依赖于此。

在我的情况下,我发现我可以使用Katana解决方案中的以下更改(我的叉位于https://katanaproject.codeplex.com/SourceControl/changeset/b18d18b2c9b6ebccf9e26311c74cd7896d4a7824)来完成这一切:

  1. 从解决方案中卸载Microsoft.Owin项目
  2. 对于引用Microsoft.Owin的每个项目,修改它以从Nuget中提取Microsoft.Owin的官方3.0.1版本
  3. 构建解决方案。
  4. 获取Microsoft.Owin.SecurityMicrosoft.Owin.Security.OAuthMicrosoft.Owin.Security.Jwt的自定义dll,并在我自己的项目中使用它们(以及我在自己的项目中使用的任何其他库,这些库也具有这些依赖项,示例IdentityServer3.AccessTokenValidation)替换官方3.0.1包。
  5. 因此,我在3.0.0中发布的令牌现在可以使用我的自定义3.0.1版本在代码中进行身份验证。我不想永久保留我的代码中的自定义构建;我计划将令牌发行者从3.0.0更新到3.0.1,此时我还将恢复到官方的3.0.1版本。

    您的里程可能会有所不同,我对此解决方案的价值或使用时可能发生的任何事情不承担任何责任;)

答案 1 :(得分:1)

我在升级过程中遇到了同样的问题。

就我而言,我只使用TicketSerializer。幸运的是,DataSerializers.Ticket属性有一个公共setter,它允许我只换掉组件。

  1. 将票证序列化程序从v2.0.1复制到我的解决方案中作为后备序列化程序
  2. 编写了一个新的IDataSerializer,它使用新的序列化程序(3.0.1)进行序列化,尝试使用新的序列化程序进行反序列化,然后回退到v2.1.0序列化程序。
  3. 过了一会儿(所有v2令牌都已过期)我应该可以将它全部交换回v3.0.1序列化程序。

    尚未完全测试,但到目前为止似乎还不错。希望这会有所帮助。