簡體   English   中英

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

[英]Implementing Authentication and role based authorization in ASP.NET MVC web API service and MVC client architecture

在為我的Web API(服務)-MVC(客戶端)體系結構項目實施身份驗證/授權方案時,我很難決定一種方法。 即使我已經在Web API項目中實現了基於自定義令牌的身份驗證,但我仍然很難在哪里確切地實現授權(在客戶端或在API本身中)。


架構概述:

  • 項目解決方案-
    |
    | __基於ASP.NET Web API的REST服務(獨立托管在IIS上的M / C 1)
    |
    | __基於ASP.NET MVC的客戶端(獨立托管在IIS上的M / C 2消耗REST服務)
    |
    | __智能手機客戶端應用程序(使用REST服務)

已實施身份驗證:

  • Web API中的基於令牌的身份驗證(使用消息處理程序)-它為經過身份驗證的用戶生成SHA1加密令牌,該令牌需要成為每個HTTP請求標頭中的一部分。
    (令牌=用戶名+用戶IP)

  • 受SSL保護的HTTP請求。 (同樣,使用消息處理程序)

當前問題:

  1. 授權應在哪一層實施?
  2. 用戶角色應如何在客戶端保持不變? 使用Cookies? 或將角色信息添加到令牌本身(這可能會增加API解密信息的開銷以及額外的DB調用來檢索與該角色關聯的權限的開銷)
  3. 身份驗證令牌應如何與客戶端會話保持在一起?
  4. 既然我的應用程序是SPA MVC應用程序,那么將身份驗證令牌作為我對API進行的每個AJAX調用的一部分的最佳方法是什么?

我希望,在考慮整個身份驗證/授權概念的同時,我沒有做錯任何事情。 因此,我將不勝感激任何替代方法/建議。

首先,我認為發明自己的身份驗證機制絕不是一個好主意。

要回答您當前的問題:

1通常來說,您總是希望使用身份驗證來保護Api,因為它是您訪問數據的地方。 您的客戶端(MVC應用程序/智能手機)應授權自己訪問您的Api。

2&3因為您使用的是REST Api,所以我建議保持Api無狀態,換句話說,不要保留任何會話信息。 只需在令牌中包括所需的角色數據即可。 例如,您可以使用JSON Web令牌

4我將始終使用授權標頭發送授權數據。 在您的DelegatingHandler中(請注意不同的MessageHandler MVC,DelegatingHander HTTP),您可以通過simpy檢索標頭。

protected override Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken)
 {
    var authorizationHeader = request.Headers.Authorization;
    // Your authorization logic.

    return base.SendAsync(request, cancellationToken);
 }

有關如何在ajax調用中包括授權標頭的更多信息,請參見: 如何在jQuery和AJAX中使用Basic Auth?

額外信息:

如果您是我,我還將看一下Thinktecture的Identity Server: https : //github.com/thinktecture/Thinktecture.IdentityServer.v2

也許這個答案關於REST服務的身份驗證將幫助您還有: REST服務認證

為什么要創建一個完整的令牌系統(除非您使用某種聯合安全性),否則您將具有表單身份驗證和cookie,一旦設置並返回cookie,瀏覽器就會將cookie與SPA發出的所有AJAX請求一起發送給cookie。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM