首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET MVC 五大 AuthorizationFilter 實作與授權邏輯全解析

     編輯:關於ASP.NET

AuthorizationFilter 是 MVC 請求管線中最先執行的過濾器,負責授權檢查。若授權失敗,可直接短路後續 Model 繫結、Action 執行等流程。本文詳細介紹 IAuthorizationFilter 介面、內建 AuthorizeAttribute 以及其與 PrincipalPermissionAttribute 的授權邏輯差異。

一、IAuthorizationFilter 介面與 AuthorizationContext

public interface IAuthorizationFilter
{
    void OnAuthorization(AuthorizationContext filterContext);
}

public class AuthorizationContext : ControllerContext
{
    public ActionDescriptor ActionDescriptor { get; set; }
    public ActionResult Result { get; set; }
}

ActionInvoker 會建立 AuthorizationContext,依 Order/Scope 排序後依序呼叫 OnAuthorization。若任一 Filter 設定 Result(如 HttpUnauthorizedResult 產生 401 回應),整個 Action 執行終止。

二、AuthorizeAttribute 核心授權邏輯

AuthorizeAttribute 可套用於 Controller 或 Action,支援 Users(用戶清單)與 Roles(角色清單)屬性。未指定時僅要求用戶已驗證。

關鍵差異: AuthorizeAttribute 採「邏輯 AND」—— 用戶必須同時滿足 Users 與 Roles 條件;PrincipalPermissionAttribute 採「邏輯 OR」—— 滿足任一條件即可。

// 僅允許用戶 Foo 且具備 Admin 角色
[Authorize(Users="Foo", Roles="Admin")]
public void FooAndAdmin() { }

// 允許用戶 Foo 或具備 Admin 角色者
[PrincipalPermission(SecurityAction.Demand, Name="Foo", Role="Admin")]
public void FooOrAdmin() { }

三、多重屬性疊加行為

  • 多個 AuthorizeAttribute:需通過所有授權檢查(AND 關係)。[Authorize(Users="Foo")][Authorize(Users="Bar")] 導致無人可存取。
  • 多個 PrincipalPermissionAttribute:通過任一授權即可(OR 關係)。

此差異源於設計哲學:AuthorizeAttribute 強調最小權限原則,PrincipalPermissionAttribute 基於代碼存取安全(CAS)模型。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved