WebAPI認證和授權


身份驗證(Authentication):確定用戶是誰。

授權(Authorization):確定用戶能做什么,不能做什么。

授權發生在管道中更接近 controller 的位置。

 
         
  • 授權篩選器(Authorization filter)在 action 之前運行。若請求未授權,返回錯誤,action 不運行。
  • 在 action 內部,可以用 ApiController.User 屬性獲取主體對象,做進一步的控制。
 
         

 

一 身份認證

WebApi 假定身份驗證發生在宿主程序稱中。對於 web-hosting,宿主是 IIS。這種情況下使用 HTTP Module 進行驗證。

驗證時,宿主會創建一個表示安全上下文的主體對象(實現 IPrincipal),將它附加到當前線程。主體對象包含一個存儲用戶信息的 Identity 對象。若驗證成功,Identity.IsAuthenticated 屬性將返回 true

身份認證有兩種方式
(1)
HTTP 消息處理程序(HTTP Message Handler) (2)過濾器 AuthorizeAttribute
[Authorize] 屬性
AuthorizeAttribute 是內置的授權篩選器。用戶未通過身份驗證時,它返回 HTTP 401 狀態碼。可以在全局,控制和 action 三個級別應用它。

在全局級別應用:

public static void Register(HttpConfiguration config)
{
    config.Filters.Add(new AuthorizeAttribute());
}
在控制器級別應用:

[Authorize]
public class ValuesController : ApiController
{
    public HttpResponseMessage Get(int id) { ... }
    public HttpResponseMessage Post() { ... }
}
在 Action 級別應用: 復制代碼
public class ValuesController : ApiController { public HttpResponseMessage Get() { ... } [Authorize] public HttpResponseMessage Post() { ... } } 在控制器上應用 [Authorize] 時,可以在 Action 上應用 [AllowAnonymous] 取消對某個 Action 的授權要求。上面的代碼可以改成下面的形式: [Authorize] public class ValuesController : ApiController { [AllowAnonymous] public HttpResponseMessage Get() { ... } public HttpResponseMessage Post() { ... } } 指定用戶和角色進行限制: // 按用戶限制訪問 [Authorize(Users="Alice,Bob")] public class ValuesController : ApiController { } // 按角色限制訪問 [Authorize(Roles="Administrators")] public class ValuesController : ApiController { } 用於 WebAPI 的 AuthorizeAttribute 位於 System.Web.Http 命名空間。在 System.Web.Mvc 命名空間中有一個同名屬性,不可用於 WebAPI。

 

自定義授權篩選器
可從以下類型派生自定義授權篩選器

AuthorizeAttribute,基於用戶和角色進行授權。
AuthorizationFilterAttribute,不基於用戶和角色的同步授權。
IAuthorizationFilter,實現此接口執行異步授權邏輯。例如,授權邏輯中有對 IO 或網絡的異步調用。(CPU-bound的授權邏輯更適合從 AuthorizationFilterAttribute 派生,這樣不必寫異步方法)。
下圖是 AuthorizeAttribute 類層次



在 Action 中執行驗證
可在控制器中檢查 ApiController.User 屬性,根據用戶和角色使用不同的邏輯。 public HttpResponseMessage Get()
{
    if (User.IsInRole("Administrators"))
    {
        // ...
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM