我想要覆盖[Authorize]属性的默认行为。我找到了这个similar question,但它已经很老了,MVC自发布以来已经进行了一些迭代。
我不想创建一个单独的定制'属性类并在所有控制器/操作上应用该属性,以便仅将未经授权的请求发送到单独的控制器/操作。我希望能够在全局范围内执行此操作并影响已使用[Authorize]属性配置的所有控制器/操作。
这可能吗?
答案 0 :(得分:1)
确定。由于没有办法覆盖[授权]属性,无论是全局还是现场,我都是这样做的。
在应用程序的全局命名空间中创建一个新的自定义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
来处理错误并添加了一个" NotAuthorized"为我的需要采取行动。如果你愿意,你当然可以扩展它。也许包括一些日志记录?
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();
}
}
}
不要忘记创建必要的观点!