4

我有一个配置了 simplemembership 的 MVC4 项目。这一切都在工作等等,但我想知道如何告诉它当用户无权查看给定页面时重定向到哪个控制器/动作。

例如,如果我使用[Authorize(Roles="Admin")]并尝试使用没有“管理员”角色的登录用户查看该页面,即使我已经登录,它也会将我重定向到登录页面。

我想将此更改为其他内容...可能是 404 或一条很好的消息,说“您无权查看该内容”。

我已经尝试搜索几乎所有我能想到的与此相关的内容,但到目前为止还没有找到答案。

这可以通过当前设置完成还是我需要其他东西?指向正确方向的指针将不胜感激:)

4

2 回答 2

2

不幸的是,这是整个 Asp.net 的一个问题(尽管它源于 HTTP 规范中的一个问题),它没有区分未经授权的用户和未经身份验证的用户,即使他们似乎特意说话关于差异。为了改变这种行为,您必须编写大量代码,并且编写自定义处理程序来检查您是否已经通过身份验证更容易。

HTTP 标准从未打算让用户处于“经过身份验证的状态”。事实上,它甚至不知道“用户”的概念。每个页面请求都旨在携带独立于其他页面请求的信息。浏览器缓存此信息(或通过 cookie 完成身份验证)这一事实与标准的意图无关。

该标准基本上说,如果请求的资源未经授权,服务器应该发出 401,并且由于每个请求都有自己的授权,因此意图是一个简单的通过/失败场景。该站点没有授权状态的概念。请求成功或失败。

我认为像 ASP.NET 这样的框架在创建自己的授权/身份验证状态方面已经走了很长一段路,但它们真的应该一路走下去。

您可能会发现这个线程对网络社区之间关于确切解释的分歧很有启发性。

403 Forbidden vs 401 Unauthorized HTTP 响应

于 2013-05-24T00:19:07.730 回答
2

尝试创建一个自定义的AuthorizeAttribute并覆盖OnAuthorization方法,以便在授权失败时重定向到自定义页面,如果身份验证失败则重定向到登录页面。有些人使用的另一种方法是检查当前用户是否在登录页面上通过了身份验证,如果是,您可以假设他们因为授权失败而被重定向到此页面。在这种情况下,向用户显示一条特殊消息,表明他们无权访问该页面。对于某些应用程序,这可能是有意义的,因为用户可能有多个帐户,并且他们希望登录到授权他们执行操作的另一个帐户。本 QA中讨论了其中一些概念。

于 2013-05-24T14:38:29.910 回答