如何配置使用授权(角色)属性时会发生什么?

时间:2013-05-23 23:50:46

标签: asp.net-mvc-4 simplemembership roleprovider

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

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

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

我已经尝试使用谷歌搜索我能想到的所有事情,但到目前为止还没有找到答案。

可以使用当前设置完成此操作还是需要其他设置?可以理解正确方向的指针:)

2 个答案:

答案 0 :(得分:2)

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

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

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

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

对于网络社区对确切解释的分歧,您可能会发现此主题具有启发性。

403 Forbidden vs 401 Unauthorized HTTP responses

答案 1 :(得分:2)

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