ASP.Net MVC5:当用户没有特定的操作角色时,如何重定向并显示正确的错误消息

时间:2016-09-21 14:02:55

标签: asp.net-mvc-5

登录后,用户可以进行任何操作,但会考虑何时使用授权属性修饰操作,并且角色名称是特定的。只需参考示例代码。

public class HomeController : Controller
 {
     [Authorize(Roles = "Admin, HrAdmin")]
     public ActionResult PayRoll()
     {
         return View();
     }
 }

假设用户Foo没有管理员或HRAdmin之类的角色那么当用户foo尝试访问PayRoll操作时会发生什么?

在这种情况下,我想将用户重定向到我的错误页面,在那里我将向用户显示一条友好的消息。请指导我怎么做?

我是否需要从那里编写自定义授权属性我需要检查用户是否有那些角色,然后从那里重定向用户?

1 个答案:

答案 0 :(得分:1)

我不知道这是否是最好的方法,但这就是我如何做到的:

using System.Web.Mvc;

namespace YourNamespace
{
    public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            base.OnAuthorization(filterContext);

            // Redirect to the login page if necessary
            if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
            {
                filterContext.Result = new RedirectResult(System.Web.Security.FormsAuthentication.LoginUrl + "?returnUrl=" + filterContext.HttpContext.Request.Url);
                return;
            }

            // Redirect to your "access denied" view here
            if (filterContext.Result is HttpUnauthorizedResult)
            {
                filterContext.Result = new RedirectResult("~/Account/Denied");
            }
        }
    }
}

控制器:

public class HomeController : Controller
{
    [AccessDeniedAuthorize(Roles = "Admin, HrAdmin")]
    public ActionResult PayRoll()
    {
        return View();
    }
}

如果您的用户正确定义了其角色,那么您就必须这样做。如果您不使用ASP.NET Identity来管理您的用户和角色,则需要更多代码才能使其工作,在这种情况下,这可能会对您有所帮助:{{3}}。