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");
}
}
}
}
默認 AuthorizeAttribute 返回 HttpUnauthorizedResult (設置 401) → 觸發認證模塊跳轉登入頁。但用戶**已登入**,只是**無權限**,邏輯不符。
public class HttpUnauthorizedResult : ActionResult {
public override void ExecuteResult(ControllerContext context) {
context.HttpContext.Response.StatusCode = 401; // 激活認證模塊 → 登入頁
}
}
[TokenAclAuthorize(Roles = "Admin,Manager")]
public ActionResult SensitiveAction() { ... }
AccessDeniedUrlActionResult (如返回 JSON 錯誤給 AJAX 請求)