AuthorizationFilter 是 MVC 請求管線中最先執行的過濾器,負責授權檢查。若授權失敗,可直接短路後續 Model 繫結、Action 執行等流程。本文詳細介紹 IAuthorizationFilter 介面、內建 AuthorizeAttribute 以及其與 PrincipalPermissionAttribute 的授權邏輯差異。
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 可套用於 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() { }
[Authorize(Users="Foo")][Authorize(Users="Bar")] 導致無人可存取。此差異源於設計哲學:AuthorizeAttribute 強調最小權限原則,PrincipalPermissionAttribute 基於代碼存取安全(CAS)模型。