将 Owin 从 3.0.0 更新到 3.0.1 后,旧令牌停止工作
Old tokens stopped working after updating Owin from 3.0.0 to 3.0.1
我在我的 WebApi 项目中将 Owin nuget 包从 3.0.0 更新到 3.0.1,但是在更新之后,旧版本生成并保存在客户端的所有用户令牌停止使用新部署.
有没有办法让旧用户令牌与新版本一起使用,否则所有用户都需要再次登录系统才能获得新的访问令牌,我想避免这种情况。
3.0.0 和 3.0.1 之间的不兼容是由于 Microsoft.Owin.Security.DataHandler.Serializer.TokenSerializer
class 的 3.0.0 版本中的一个错误。这个 class 有一个私有常量 FormatVersion
,它表示令牌格式的版本。 this 的值在 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, and you can see the commit which broke the compatibility between 3.0.0 and 3.0.1 at https://katanaproject.codeplex.com/SourceControl/changeset/b18d18b2c9b6ebccf9e26311c74cd7896d4a7824 查看有关 2.x 和 3.0.0 之间格式更改的讨论。
好消息是 3.0.0 和 3.0.1 之间的安全实现似乎没有任何其他重大差异,而且似乎有一种方法可以让这一切再次发挥作用。 Katana 项目是开源的,因此您可以构建自己的 3.0.1 版本来解决该错误。您要进行的更改在 TokenSerializer.Read()
中,因此如果令牌的版本为 2 或 3,则令牌会被接受。
使这有点棘手的是 Microsoft.Owin 包的命名很明确,因此引用它们的任何内容也需要更新以明确引用您的自定义构建。因此,您真的只需要 Microsoft.Owin.* 库的自定义构建,这些库会直接受到您对 TokenSerializer 的更改的影响,否则您会给自己做很多不必要的工作。就我而言,我发现我真正关心的库是 Microsoft.Owin.Security
、Microsoft.Owin.Security.OAuth
和 Microsoft.Owin.Security.Jwt
。特别是,您要避免 Microsoft.Owin
的自定义构建,因为其他库依赖于它。
就我而言,我发现我可以在 Katana 解决方案中进行以下更改(我的分支位于 https://katanaproject.codeplex.com/SourceControl/network/forks/binarymash/katanaproject?branch=FixCompatabilityWith3.0.0):
- 从解决方案中卸载
Microsoft.Owin
项目
- 对于每个引用
Microsoft.Owin
的项目,修改它以从 Nuget 中提取 Microsoft.Owin
的官方 3.0.1 版本
- 构建解决方案。
- 获取
Microsoft.Owin.Security
、Microsoft.Owin.Security.OAuth
和 Microsoft.Owin.Security.Jwt
的自定义 dll,并在我自己的项目中使用它们(以及我在自己的项目中使用的任何其他库也具有这些依赖项, 例如 IdentityServer3.AccessTokenValidation
) 替换官方 3.0.1 包。
因此,我在 3.0.0 中颁发的令牌现在可以使用我的自定义 3.0.1 版本在代码中进行身份验证。我不想在我的代码中永久保留我的自定义构建;我计划将令牌发行者从 3.0.0 更新到 3.0.1,届时我还将恢复到官方 3.0.1 版本。
您的里程可能会有所不同,对于此解决方案的价值或您使用它时可能发生的任何事情,我不承担任何责任 ;)
我今天 运行 在升级过程中遇到了同样的问题。
在我的例子中,我只使用了 TicketSerializer。对我来说幸运的是,DataSerializers.Ticket 属性 有一个 public setter 可以让我更换组件。
- 将 v2.0.1 中的票据序列化程序作为回退序列化程序复制到我的解决方案中
- 编写了一个新的 IDataSerializer,它使用新的票据序列化程序 (3.0.1) 进行序列化,尝试使用新的序列化程序进行反序列化并回退到 v2.1.0 序列化程序。
一段时间后(一旦所有 v2 令牌都已过期)我应该能够将其全部交换回 v3.0.1 序列化程序。
尚未进行全面测试,但目前看来还不错。希望这有帮助。
我在我的 WebApi 项目中将 Owin nuget 包从 3.0.0 更新到 3.0.1,但是在更新之后,旧版本生成并保存在客户端的所有用户令牌停止使用新部署.
有没有办法让旧用户令牌与新版本一起使用,否则所有用户都需要再次登录系统才能获得新的访问令牌,我想避免这种情况。
3.0.0 和 3.0.1 之间的不兼容是由于 Microsoft.Owin.Security.DataHandler.Serializer.TokenSerializer
class 的 3.0.0 版本中的一个错误。这个 class 有一个私有常量 FormatVersion
,它表示令牌格式的版本。 this 的值在 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, and you can see the commit which broke the compatibility between 3.0.0 and 3.0.1 at https://katanaproject.codeplex.com/SourceControl/changeset/b18d18b2c9b6ebccf9e26311c74cd7896d4a7824 查看有关 2.x 和 3.0.0 之间格式更改的讨论。
好消息是 3.0.0 和 3.0.1 之间的安全实现似乎没有任何其他重大差异,而且似乎有一种方法可以让这一切再次发挥作用。 Katana 项目是开源的,因此您可以构建自己的 3.0.1 版本来解决该错误。您要进行的更改在 TokenSerializer.Read()
中,因此如果令牌的版本为 2 或 3,则令牌会被接受。
使这有点棘手的是 Microsoft.Owin 包的命名很明确,因此引用它们的任何内容也需要更新以明确引用您的自定义构建。因此,您真的只需要 Microsoft.Owin.* 库的自定义构建,这些库会直接受到您对 TokenSerializer 的更改的影响,否则您会给自己做很多不必要的工作。就我而言,我发现我真正关心的库是 Microsoft.Owin.Security
、Microsoft.Owin.Security.OAuth
和 Microsoft.Owin.Security.Jwt
。特别是,您要避免 Microsoft.Owin
的自定义构建,因为其他库依赖于它。
就我而言,我发现我可以在 Katana 解决方案中进行以下更改(我的分支位于 https://katanaproject.codeplex.com/SourceControl/network/forks/binarymash/katanaproject?branch=FixCompatabilityWith3.0.0):
- 从解决方案中卸载
Microsoft.Owin
项目 - 对于每个引用
Microsoft.Owin
的项目,修改它以从 Nuget 中提取 - 构建解决方案。
- 获取
Microsoft.Owin.Security
、Microsoft.Owin.Security.OAuth
和Microsoft.Owin.Security.Jwt
的自定义 dll,并在我自己的项目中使用它们(以及我在自己的项目中使用的任何其他库也具有这些依赖项, 例如IdentityServer3.AccessTokenValidation
) 替换官方 3.0.1 包。
Microsoft.Owin
的官方 3.0.1 版本
因此,我在 3.0.0 中颁发的令牌现在可以使用我的自定义 3.0.1 版本在代码中进行身份验证。我不想在我的代码中永久保留我的自定义构建;我计划将令牌发行者从 3.0.0 更新到 3.0.1,届时我还将恢复到官方 3.0.1 版本。
您的里程可能会有所不同,对于此解决方案的价值或您使用它时可能发生的任何事情,我不承担任何责任 ;)
我今天 运行 在升级过程中遇到了同样的问题。
在我的例子中,我只使用了 TicketSerializer。对我来说幸运的是,DataSerializers.Ticket 属性 有一个 public setter 可以让我更换组件。
- 将 v2.0.1 中的票据序列化程序作为回退序列化程序复制到我的解决方案中
- 编写了一个新的 IDataSerializer,它使用新的票据序列化程序 (3.0.1) 进行序列化,尝试使用新的序列化程序进行反序列化并回退到 v2.1.0 序列化程序。
一段时间后(一旦所有 v2 令牌都已过期)我应该能够将其全部交换回 v3.0.1 序列化程序。
尚未进行全面测试,但目前看来还不错。希望这有帮助。