Asp.net mvc 身份验证过滤器覆盖默认重定向

Asp.net mvc Authentication filter overide default reditect

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

1
 [Authorize(Roles ="ManageRoles")]

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

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

我必须实现自定义过滤器吗?如果可能,我想尝试使用 redirectTo 操作,以便在不同情况下有不同的错误页面。


MVC5 实际上已经开始解决这个问题。除了授权过滤器之外,它们现在还包括身份验证过滤器。这些文档很少,但我的直觉是,这是将身份验证与授权分开的第一次尝试(到目前为止,ASP.NET 将两者混淆了)

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


Use Custom Authorize Attribure - Ben Scheirman 或 Ben Cull\\'s answer in this thread。

还检查 Mark\\ 对类似问题的回答,他使用 HandleUnauthorizedRequest 重定向未经授权的用户。

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


在您的 Login 视图中,您可以添加以下逻辑:

  • 检查请求是否未通过身份验证
    1.1。显示登录表单
  • 检查用户是否已通过身份验证但不是所需的角色
    2.1。显示错误信息
  • 由于您的 Web.config 设置会自动将您重定向到登录页面,因此您可以利用此机制。

    1
    2
    3
    4
    5
    6
    7
    8
    if (!Request.IsAuthenticated)
    {
         //render login form
    }
    else
    {
         <p>Error: you do not have the necessary credentials to access this resource.</p>
    }

    另一种选择是创建自己的AuthorizationAttribute。这个问题和你的类似。你可能会发现它很有用。