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

时间:2014-04-04 18:30:06

标签: c# asp.net-mvc asp.net-mvc-5 authorize-attribute

我想要覆盖[Authorize]属性的默认行为。我找到了这个similar question,但它已经很老了,MVC自发布以来已经进行了一些迭代。

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

这可能吗?

1 个答案:

答案 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();
        }
}
}

不要忘记创建必要的观点!