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

ASP.NET MVC 自定義 AuthorizeAttribute:基於角色的權限驗證與 403 重定向實現

     編輯:關於.NET

核心需求

  • 用戶已認證 (登入),但需授權 (角色/權限) 控制 Action 訪問
  • 無權限時返回 403 並重定向至指定頁面 (而非跳轉登入頁)

實現代碼

namespace TokenAcl.Web.Helper {
    public class TokenAclAuthorizeAttribute : AuthorizeAttribute {
        protected override bool AuthorizeCore(HttpContextBase httpContext) {
            if (httpContext == null) throw new ArgumentNullException("httpContext");
            
            string[] users = Users.Split(',');
            string[] roles = Roles.Split(',');
            
            if (!httpContext.User.Identity.IsAuthenticated) return false;
            
            bool result = false;
            if (roles.Length != 0) {
                // 從自研權限系統獲取用戶角色
                List<Role> rightRoles = RightClient.GetAllRole(TakenAclMenu.SystemID, TakenAclMenu.UserID);
                foreach (var role in roles) {
                    if (rightRoles.Any(r => r.Code == role)) {
                        result = true; break;
                    }
                }
            }
            
            if (!result) httpContext.Response.StatusCode = 403;
            return result;
        }

        public override void OnAuthorization(AuthorizationContext filterContext) {
            base.OnAuthorization(filterContext);
            if (filterContext.HttpContext.Response.StatusCode == 403) {
                filterContext.Result = new RedirectResult("/Admin/Dashboard");
            }
        }
    }
}

關鍵設計決策

為什麼重寫 OnAuthorization?

默認 AuthorizeAttribute 返回 HttpUnauthorizedResult (設置 401) → 觸發認證模塊跳轉登入頁。但用戶**已登入**,只是**無權限**,邏輯不符。

HttpUnauthorizedResult 源碼分析

public class HttpUnauthorizedResult : ActionResult {
    public override void ExecuteResult(ControllerContext context) {
        context.HttpContext.Response.StatusCode = 401; // 激活認證模塊 → 登入頁
    }
}

使用方式

[TokenAclAuthorize(Roles = "Admin,Manager")]
public ActionResult SensitiveAction() { ... }

擴展建議

  • 將重定向目標提取為屬性 AccessDeniedUrl
  • 支持自定義 ActionResult (如返回 JSON 錯誤給 AJAX 請求)
  • 整合輸出緩存、日誌記錄
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved