2015-05-06 42 views
0

我在WebApi項目中將Owin nuget包從3.0.0更新到3.0.1,但在更新所有舊用戶標記之後版本,並保存在客戶端,停止使用新的部署。將Owin從3.0.0更新到3.0.1後,舊標記停止工作

有沒有辦法讓舊用戶令牌保持與新版本一起工作,否則所有用戶都需要再次登錄系統才能獲得新的訪問令牌,這是我想避免的。

回答

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.OAuthMicrosoft.Owin.Security.Jwt。特別是,你會想避免自定義構建Microsoft.Owin,因爲其他庫依賴於它。

以我爲例,我發現,我能得到這一切與武士刀的解決方案如下更改工作(我的叉子在https://katanaproject.codeplex.com/SourceControl/network/forks/binarymash/katanaproject?branch=FixCompatabilityWith3.0.0):

  1. 卸載從溶液
  2. Microsoft.Owin項目每個引用Microsoft.Owin的項目,修改它以從Nuget中提取官方3.0.1版本Microsoft.Owin
  3. 構建解決方案。
  4. 就拿定製的dll爲Microsoft.Owin.SecurityMicrosoft.Owin.Security.OAuthMicrosoft.Owin.Security.Jwt,在我自己的項目中使用它們(以及任何其他庫我在自己的項目中使用也有這些依賴關係,例如IdentityServer3.AccessTokenValidation)取代官方3.0.1包。

因此,我在3.0.0中發佈的令牌現在可以使用我的自定義3.0.1構建在代碼中進行身份驗證。我不想讓我的代碼永久保存在我的代碼中;我計劃將令牌發行者從3.0.0更新到3.0.1,此時我還將恢復到官方的3.0.1版本。

您的里程可能會有所不同,我不接受這個解決方案或任何東西,如果你使用它可能發生的任何老有所爲的責任;)

1

我在升級過程中今天碰到了同樣的問題。

在我的情況下,我只使用TicketSerializer。對我來說幸運的是,DataSerializers.Ticket屬性有一個公共setter,它允許我換出組件。

    從V2.0.1到我的解決方案作爲備用串行
  1. 複製票串行
  2. 了一個新IDataSerializer該序列化使用新票串行器(3.0.1),嘗試使用新的序列化反序列化和回落到v2.1.0序列化器。

過了一段時間(一旦所有v2令牌都過期了),我應該可以將它全部交換回v3.0.1序列化程序。

尚未完全測試,但似乎迄今爲止罰款。希望這可以幫助。

+0

你需要將這個類https://github.com/aspnet/AspNetKatana/blob/master/src/Microsoft.Owin.Security/DataHandler/Serializer/TicketSerializer.cs複製到你的項目中,然後在'Microsoft .Owin.Security.DataHandler.Serializer.DataSerializers.Ticket'屬性 – zihotki

相關問題