当用户不在授权角色中时,如何提供未授权页面?

Rob*_*vey 41 c# security asp.net-mvc roles

我正在使用这样的Authorize属性:

[Authorize (Roles="Admin, User")]
Public ActionResult Index(int id)
{
    // blah
}
Run Code Online (Sandbox Code Playgroud)

当用户不在指定的角色时,我会收到一个错误页面(找不到资源).所以我也将HandleError属性放入其中.

[Authorize (Roles="Admin, User"), HandleError]
Public ActionResult Index(int id)
{
    // blah
}
Run Code Online (Sandbox Code Playgroud)

现在,如果用户不在指定的角色,它将进入" 登录"页面.

当用户不符合所需角色之一时,如何让它转到未授权页面而不是登录页面?如果发生不同的错误,我如何将该错误与未授权错误区分开来并以不同方式处理?

Run*_*une 27

将这样的内容添加到web.config中:

<customErrors mode="On" defaultRedirect="~/Login">
     <error statusCode="401" redirect="~/Unauthorized" />
     <error statusCode="404" redirect="~/PageNotFound" />
</customErrors>
Run Code Online (Sandbox Code Playgroud)

您显然应该创建/PageNotFound/Unauthorized路由,操作和视图.

编辑:对不起,我显然没有彻底理解这个问题.

问题是,当AuthorizeAttribute执行过滤器时,它会确定用户不符合要求(他/她可能已登录,但角色不正确).因此,它将响应状态代码设置为401.这将由FormsAuthentication模块拦截,然后模块将执行重定向.

我看到两种选择:

  1. 禁用defaultRedirect.

  2. 创建自己的IAuthorizationFilter.派生AuthorizeAttribute并覆盖HandleUnauthorizedRequest.在此方法中,如果用户通过身份验证,请重定向到/ Unauthorized

我也不喜欢:defaultRedirect功能很好,而不是你想要自己实现的东西.第二种方法导致向用户提供视觉上正确的"您未经授权"页面,但HTTP状态代码将不是所需的401.

我不太了解HttpModules是否可以通过一个可容忍的黑客来规避这个问题.

编辑2:如何以下列方式实现自己的IAuthorizationFilter:从CodePlex下载MVC2代码并"借用"AuthorizeAttribute的代码.将OnAuthorization方法更改为

    public virtual void OnAuthorization(AuthorizationContext filterContext)
    {
        if (AuthorizeCore(filterContext.HttpContext))
        { 
            HttpCachePolicyBase cachePolicy = filterContext.HttpContext.Response.Cache;
            cachePolicy.SetProxyMaxAge(new TimeSpan(0));
            cachePolicy.AddValidationCallback(CacheValidateHandler, null /* data */);
        }
        // Is user logged in?
        else if(filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            // Redirect to custom Unauthorized page
            filterContext.Result = new RedirectResult(unauthorizedUrl);
        } 
        else {
            // Handle in the usual way
            HandleUnauthorizedRequest(filterContext);
        }
    }
Run Code Online (Sandbox Code Playgroud)

where unauthorizedUrl是过滤器上的属性或从Web.config读取.

您也可以从AuthorizeAttribute继承并覆盖OnAuthorization,但最终您将编写一些已在AuthorizeAttribute中的私有方法.


Pbi*_*off 7

你可以用两种方式做到这一点:

  1. 指定HandleError属性的错误,并给出应显示的视图:

    [HandleError(ExceptionType = typeof(UnAuthorizedException),View ="UnauthorizedError")]

您可以指定几个不同的ExceptionTypes和视图

  1. 创建自定义ActionFilter,检查凭据,并在用户未经授权的情况下重定向到控制器:http://web.archive.org/web/20090322055514/http://msdn.microsoft.com/en-us/库/ dd381609.aspx