Asp.net

在 ASP.NET MVC Web API 服務和 MVC 客戶端架構中實現身份驗證和基於角色的授權

  • November 1, 2013

在為我的 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 請求。(再次,使用消息處理程序)

目前問題:

  1. 授權應該在哪一層執行?
  2. 使用者角色應該如何在客戶端持久化?使用 Cookie?或將角色資訊添加到令牌本身(這可能會增加 API 解密資訊的成本和額外的數據庫呼叫以檢索與該角色關聯的權限)
  3. 身份驗證令牌應如何與客戶端會話保持一致?
  4. 因為,我的應用程序是 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 服務身份驗證

引用自:https://stackoverflow.com/questions/19661223