2016-02-11 119 views
2

我有一個Web API服務,允許用戶創建新資源,如:POST /api/resource。該服務然後將創建請求放在服務總線上並以HTTP 202 Accepted作出響應。驗證服務總線後的過期JWT令牌

後臺進程從服務總線中獲取消息並調用數據訪問層來創建資源。但是,爲了執行訪問控制,數據訪問層需要知道用戶是由誰來決定是否允許他/她創建該資源。 我無法將此授權邏輯移入前端Web API,並將可信子系統用於數據訪問層。

enter image description here

所以我的解決辦法是讓對數據訪問層的訪問令牌,並將其與創建資源有效載荷存儲。但是這提出了一個問題。由於該消息可能會在重負載之後進行很多處理,因此令牌在後臺進程嘗試使用它時可能已過期。此時,無法更新令牌。

所以我想放寬在後端層處理令牌的有效性的要求。如果令牌有效(可信發行者等),但超過了過期時間,我希望驗證中間件接受該令牌。

但是沒有辦法配置System.IdentityModel.Tokens.Jwt令牌處理程序來驗證過期的令牌。這可以在沒有寫我自己的令牌驗證器的情況下完成嗎?

我的方法錯了嗎?什麼是解決這個問題的可行方案?

+0

問:當令牌被添加到服務總線開始時,令牌是否有效(如授權)?或者我誤解了你的問題 – Nkosi

+0

@Nkosi當然,該標記在Web服務獲取它時有效。但是在工作人員服務使用它時可能會過期。服務總線創建暫時解耦。消息可以在服務總線上處理,或者在一小時後處理。 – MvdD

+0

沒錯。因此即使令牌過期,與JWT關聯的包含用戶仍可以在後端提取以進行訪問控制。你對JWT有多瞭解?我問,因爲我的想法可能看起來是手動的,你需要知道解碼智威湯遜 – Nkosi

回答

2

JWT處理程序具有可擴展性點,允許您保留所有默認驗證邏輯並僅覆蓋要定製的方面 - 在本例中爲過期驗證。您可以傳遞您自己的TokenValidationParameters.LifetimeValidator實現來實現。

+0

哦,那很酷。我沒有意識到這一點。你有鏈接到更多信息? – MvdD

+2

看看https://github.com/Azure-Samples/active-directory-dotnet-webapi-manual-jwt-validation/blob/master/TodoListService-ManualJwt/Global.asax.cs - 你需要做的如果您要忽略有效性,則將TokenValidationParameters中的ValidateLifetime設置爲false。如果您想要有一個自定義驗證例程(例如接受不超過30分鐘過期的令牌),您可以按照答案中的建議實施LifetimeValidator的處理程序。 – vibronet

+0

完美,這正是我一直在尋找的! – MvdD

0

看看使用刷新標記Auth0 has a good article,用一些示例代碼說明背景以及如何使用它們。

+0

刷新標記在這裏不起作用。它們只適用於機密客戶端(Web應用程序),但這些請求來自瀏覽器。即使他們來自機密客戶端,Web API也無法訪問刷新令牌。 – MvdD