4

如果我的 ASP.NET MVC 3 (Razor) Web 应用程序中有一个区域,其中所有控制器都派生自如下所示的基本控制器:

[Authorize(Roles="Administrator")]
public class AdminController : Controller
{

}

当非管理员尝试访问该区域中的 URL 时,他们会被重定向到 web.config 中指定的登录页面。

但是,如果用户已经通过身份验证,但不是管理员,这并没有真正的意义。在那种情况下,我们不应该返回 HTTP 401 吗?

我的问题基本上是人们如何处理这个问题 - 他们是否创建自定义授权属性?

4

4 回答 4

2

看到这个线程... ASP.Net 将 401 转换为 302 错误代码

您真正想要做的是返回 403 代码。401 用于身份验证质询。ASP.NET 表单授权拦截 401 并将用户推送到登录页面。

如果您仍然想做 401,您能否描述一下最终用户的预期体验是什么?

于 2011-04-21T05:51:42.047 回答
1

我使用 ASP.NET MVC4 Beta,今天我注意到如果我ReturnUrl向查询字符串添加参数,表单模块不会更改响应。

因此,如果操作 i/Rate 具有属性[Authorize],则

<a href="/xm/i/Rate?pid=3&amp;count=2&amp;ReturnUrl=%2F">..</a>

返回 401。我不知道它是错误还是功能,但现在它可以按描述工作。

于 2012-05-22T07:18:23.663 回答
0

我们有针对此类场景的自定义授权过滤器属性,我们将用户带到自定义错误页面

public void OnAuthorization(AuthorizationContext filterContext) {


if(//user does not have permission){

filterContext.Result = new RedirectResult("/Error/AccessDenied");

}
于 2011-04-21T04:40:09.083 回答
0

如果未经授权的用户尝试访问标有 Authorize 属性的方法,MVC 框架将返回 401 HTTP 状态代码。如果站点配置为使用 ASP.NET 表单身份验证,则 401 状态代码会导致浏览器将用户重定向到登录页面。

参考:http : //msdn.microsoft.com/zh-tw/library/system.web.mvc.authorizeattribute.aspx

其他类似问题:How to intercept 401 from Forms Authentication in ASP.NET MVC?

于 2011-04-21T04:40:58.993 回答