Redirect Unauthorized Page Access in MVC to Custom View

后端 未结 5 1735
温柔的废话
温柔的废话 2020-12-23 16:36

I have an MVC website in which access is based on various Roles. Once a user logs into the system they can see navigation to the pages for which they are authorized. However

5条回答
  •  余生分开走
    2020-12-23 16:55

    After some research I think the easiest answer to this problem is just creating custom authorize, very similar to the one by jbbi (but that one didn't work since the "new HttpUnauthorizedResult()" is internaly automatically redirecting to the login - at least in mvc 5 with identity)

    public class CustomAuthorize : AuthorizeAttribute
    {
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
            {
                //if not logged, it will work as normal Authorize and redirect to the Login
                base.HandleUnauthorizedRequest(filterContext);
    
            }
            else
            {
                //logged and wihout the role to access it - redirect to the custom controller action
                filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Error", action = "AccessDenied" }));
            }
        }
    }
    

    and the usage is the same as the default Authorize:

    [CustomAuthorize(Roles = "Administrator")]
    

    Then, just to do things right, don't forget to send out the Http code of the error page. e.g like this in the controller.

    public ActionResult AccessDenied()
    {
        Response.StatusCode = 403;
        return View();
    }
    

    It's easy, it works and even I (a .net mvc rookie) understand this.

    Note: It doesn't work the same with a 401 code - it will always take over the 401 and internaly redirect it to the login. But in my case is, by definition, the 403 also fitting.

提交回复
热议问题