我在WebApi項目中將Owin nuget包從3.0.0更新到3.0.1,但在更新所有舊用戶標記之後版本,並保存在客戶端,停止使用新的部署。將Owin從3.0.0更新到3.0.1後,舊標記停止工作
有沒有辦法讓舊用戶令牌保持與新版本一起工作,否則所有用戶都需要再次登錄系統才能獲得新的訪問令牌,這是我想避免的。
我在WebApi項目中將Owin nuget包從3.0.0更新到3.0.1,但在更新所有舊用戶標記之後版本,並保存在客戶端,停止使用新的部署。將Owin從3.0.0更新到3.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.0.0和3.0.1之間打破了兼容性的提交https://katanaproject.codeplex.com/SourceControl/changeset/b18d18b2c9b6ebccf9e26311c74cd7896d4a7824。
好消息是在3.0.0和3.0.1之間的安全實現似乎沒有任何其他的主要區別,並且似乎有一種方法可以讓這一切再次運行。 Katana項目是開源的,所以你可以構建你自己的3.0.1版本,它可以解決bug。你想要做的改變是TokenSerializer.Read()
,所以如果它們的版本是2或3,就接受令牌。
是什麼讓這有點棘手是因爲Microsoft.Owin包是強命名的,所以任何引用他們還需要更新以明確引用您的自定義構建。所以,你真的只想定製直接受到TokenSerializer更改影響的Microsoft.Owin。*庫的構建,否則你會給自己很多不必要的工作。在我的情況下,我發現我真正關心的庫是Microsoft.Owin.Security
,Microsoft.Owin.Security.OAuth
和Microsoft.Owin.Security.Jwt
。特別是,你會想避免自定義構建Microsoft.Owin
,因爲其他庫依賴於它。
以我爲例,我發現,我能得到這一切與武士刀的解決方案如下更改工作(我的叉子在https://katanaproject.codeplex.com/SourceControl/network/forks/binarymash/katanaproject?branch=FixCompatabilityWith3.0.0):
Microsoft.Owin
項目每個引用Microsoft.Owin
的項目,修改它以從Nuget中提取官方3.0.1版本Microsoft.Owin
Microsoft.Owin.Security
,Microsoft.Owin.Security.OAuth
和Microsoft.Owin.Security.Jwt
,在我自己的項目中使用它們(以及任何其他庫我在自己的項目中使用也有這些依賴關係,例如IdentityServer3.AccessTokenValidation
)取代官方3.0.1包。因此,我在3.0.0中發佈的令牌現在可以使用我的自定義3.0.1構建在代碼中進行身份驗證。我不想讓我的代碼永久保存在我的代碼中;我計劃將令牌發行者從3.0.0更新到3.0.1,此時我還將恢復到官方的3.0.1版本。
您的里程可能會有所不同,我不接受這個解決方案或任何東西,如果你使用它可能發生的任何老有所爲的責任;)
我在升級過程中今天碰到了同樣的問題。
在我的情況下,我只使用TicketSerializer。對我來說幸運的是,DataSerializers.Ticket屬性有一個公共setter,它允許我換出組件。
過了一段時間(一旦所有v2令牌都過期了),我應該可以將它全部交換回v3.0.1序列化程序。
尚未完全測試,但似乎迄今爲止罰款。希望這可以幫助。
你需要將這個類https://github.com/aspnet/AspNetKatana/blob/master/src/Microsoft.Owin.Security/DataHandler/Serializer/TicketSerializer.cs複製到你的項目中,然後在'Microsoft .Owin.Security.DataHandler.Serializer.DataSerializers.Ticket'屬性 – zihotki