Asp.net mvc身份验证过滤器覆盖默认reditect

时间:2014-02-07 07:30:19

标签: asp.net asp.net-mvc authentication owin

在我的MVC 5应用程序中,我应用了一些角色过滤器,例如:

 [Authorize(Roles = "ManageRoles")]

现在,如果用户无权访问此角色,则会将我重定向到登录页面。这在我的应用程序中是不正确的,因为我想显示一条错误消息,说明您没有权限访问。

如果用户无权访问过滤器,我该如何更改会发生什么?

我是否必须实施自定义过滤器?我想尽可能尝试使用redirectTo操作,这样我就可以在不同的情况下使用不同的错误页面。

3 个答案:

答案 0 :(得分:1)

使用自定义授权Attribure - Ben Scheirman or Ben Cull's answer in this thread

同时检查Mark's response to similar question,他使用HandleUnauthorizedRequest重定向未经授权的用户。

在上述两种方法中,您可以重定向到您感兴趣的任何路径或操作,并使用HttpContent.Items []或TempData来保存要在目标页面上显示的特定错误消息或值。

答案 1 :(得分:1)

MVC5实际上已经开始解决这个问题。除授权过滤器外,它们现在还包括身份验证过滤器。这些都是非常简单的记录,但我的直觉是,这是第一次将身份验证与授权分离(直到现在,ASP.NET已经将这两者混为一谈)

我的想法是,身份验证过滤器将用于控制用户是否登录,并且将使用授权过滤器来控制您有权访问的内容。但是,这似乎还没有完全实现。

答案 2 :(得分:0)

Login视图中,您可以为:

添加逻辑
  1. 检查请求是否未经过身份验证   1.1。显示登录表单
  2. 检查用户是否经过身份验证但未达到要求的角色   2.1。显示错误消息
  3. 由于您将通过Web.config设置自动重定向到登录页面,因此您可以利用此机制。

    if (!Request.IsAuthenticated)
    {
         //render login form
    }
    else
    {
         <p>Error: you do not have the necessary credentials to access this resource.</p>
    }
    

    另一种选择是创建自己的AuthorizationAttributeThis question与您的相似。你可能会发现它很有用。