覆盖 MVC5 中的默认 [授权] 行为

本文关键字:授权 行为 默认 MVC5 覆盖 | 更新日期: 2023-09-27 17:56:36

我想覆盖 [授权] 属性的默认行为。 我发现了这个类似的问题,但它很旧,MVC 自发布以来已经进行了几次迭代。

我不希望创建一个单独的"自定义"属性类并将该属性应用于所有控制器/操作,以便仅将未经授权的请求发送到单独的控制器/操作。 我希望能够在全球范围内执行此操作,并影响已配置了 [Authorize] 属性的所有控制器/操作。

这可能吗?

覆盖 MVC5 中的默认 [授权] 行为

好的。由于没有办法全局和就地覆盖 [Authorize] 属性,以下是我完成它的方法。

在全局命名空间中为您的应用程序创建一个新的自定义AuthorizeAttribute类(我称之为我的CustomAuthorizeAttribute)。 我将这个类文件放在一个名为 Extend 的文件夹中(我在扩展 MVC 框架时放置所有自定义类的地方),并确保命名空间与我的应用程序的根命名空间相同(这样所有控制器都可以"看到"它)。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace CustomProject
{
    public class CustomAuthorizeAttribute : AuthorizeAttribute
    {
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            System.Web.Routing.RouteValueDictionary rd;
            if (filterContext.HttpContext.User.Identity.IsAuthenticated)
            {
                rd = new System.Web.Routing.RouteValueDictionary(new { action = "NotAuthorized", controller = "Error" });
            }
            else
            {
                //user is not authenticated
                rd = new System.Web.Routing.RouteValueDictionary(new { action = "Login", controller = "Account" });
            }
            filterContext.Result = new RedirectToRouteResult(rd);
        }
    }
}

我的CustomAuthorizeAttribute考虑了经过身份验证的用户方案并适当地重新路由/重定向。

然后,您需要将[CustomAuthorize(Roles="Admin")](使用为应用程序配置的角色)添加到要仔细检查的控制器和/或操作。

此外,我创建了一个处理错误的ErrorController,并根据我的需要添加了"未授权"操作。 如果您愿意,您当然可以扩展它。 也许包括一些日志记录?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace HypeKick.BankUI.Controllers
{
    public class ErrorController : Controller
    {
        //
        // GET: /Error/
        public ActionResult Index()
        {
            return View();
        }
        public ActionResult NotAuthorized()
        {
            return View();
        }
}
}

不要忘记创建必要的视图!