覆盖 MVC5 中的默认 [授权] 行为
本文关键字:授权 行为 默认 MVC5 覆盖 | 更新日期: 2023-09-27 17:56:36
我想覆盖 [授权] 属性的默认行为。 我发现了这个类似的问题,但它很旧,MVC 自发布以来已经进行了几次迭代。
我不希望创建一个单独的"自定义"属性类并将该属性应用于所有控制器/操作,以便仅将未经授权的请求发送到单独的控制器/操作。 我希望能够在全球范围内执行此操作,并影响已配置了 [Authorize] 属性的所有控制器/操作。
这可能吗?
好的。由于没有办法全局和就地覆盖 [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();
}
}
}
不要忘记创建必要的视图!