在 ASP.NET MVC Web API 服務和 MVC 客戶端架構中實現身份驗證和基於角色的授權
在為我的 Web API(服務)-MVC(客戶端)架構項目實施身份驗證/授權方案時,我很難決定一種方法。儘管我已經在 Web API 項目中實現了基於自定義令牌的身份驗證,但我發現我應該在哪裡實現授權(在客戶端或 API 本身中)很難。
架構概述:
- 項目解決方案-
|
| __ 基於 ASP.NET Web API 的 REST 服務(獨立託管在 M/C 1 的 IIS 上)
|
| __ 基於 ASP.NET MVC 的客戶端(獨立託管在 IIS 上的 M/C 2 使用 REST 服務)
|
| __ 智能手機客戶端應用程序(使用 REST 服務)
已實現身份驗證:
- Web API 中基於令牌的身份驗證(使用消息處理程序) - 它為經過身份驗證的使用者生成 SHA1 加密令牌,該令牌需要成為每個 http 請求標頭的一部分以進行身份驗證。
(令牌 = 使用者名 + 使用者 IP)
- SSL 保護的 HTTP 請求。(再次,使用消息處理程序)
目前問題:
- 授權應該在哪一層執行?
- 使用者角色應該如何在客戶端持久化?使用 Cookie?或將角色資訊添加到令牌本身(這可能會增加 API 解密資訊的成本和額外的數據庫呼叫以檢索與該角色關聯的權限)
- 身份驗證令牌應如何與客戶端會話保持一致?
- 因為,我的應用程序是 SPA MVC 應用程序,將身份驗證令牌作為我對 API 進行的每個 AJAX 呼叫的一部分包含在內的最佳方法是什麼?
我希望,在考慮整個身份驗證/授權概念時,我沒有做錯任何事情。因此,我將不勝感激任何替代方法/建議。
首先,我認為發明自己的身份驗證機制絕不是一個好主意。
要回答您目前的問題:
1一般來說,您總是希望使用身份驗證來保護您的 Api,因為它是您訪問數據的地方。您的客戶端(MVC 應用程序/智能手機)應授權自己訪問您的 Api。
2 & 3 由於您使用的是 REST Api,我建議您保持 Api 無狀態,換句話說,不要保留任何會話資訊。只需在您的 Token 中包含您需要的角色數據。例如,您可以使用JSON Web Token。
4 我總是使用授權標頭來發送授權數據。在您的 DelegatingHandler(注意 MessageHandler MVC、DelegatingHander HTTP 的區別)中,您可以簡單地檢索標頭。
protected override Task<HttpResponseMessage> SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { var authorizationHeader = request.Headers.Authorization; // Your authorization logic. return base.SendAsync(request, cancellationToken); }有關如何在 ajax 呼叫中包含授權標頭的更多資訊,請參閱:How to use Basic Auth with jQuery and AJAX?
額外資訊:
如果我是你,我也會看看 Thinktecture 的身份伺服器:https ://github.com/thinktecture/Thinktecture.IdentityServer.v2
也許這個關於 REST 服務身份驗證的答案也會對您有所幫助: REST 服務身份驗證