首页 文章

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

提问于
浏览
0

我想要覆盖[2]属性的默认行为。我发现这个类似的问题但它已经很老了,MVC 自发布以来已经进行了一些迭代。

我不希望创建一个单独的“自定义”属性类,并在所有 controllers/actions 上应用该属性,以便仅将未经授权的请求发送到单独的 controller/action。我希望能够在全局范围内执行此操作并影响已使用[5]属性配置的所有 controllers/actions。

这可能吗?

1 回答

  • 1

    好。由于没有办法覆盖[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考虑了经过身份验证的用户方案和 reroutes/redirects。

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

    另外,我创建了一个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();
            }
    }
    }
    

    别忘了创建必要的视图!

相关问题