【问题标题】:Question about [Authorize] Attribute for Administrators关于管理员 [Authorize] 属性的问题
【发布时间】:2011-08-10 00:24:48
【问题描述】:

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

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

}

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

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

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

【问题讨论】:

  • 已投票结束 - 因为我发现了另一个确切的问题:stackoverflow.com/questions/238437/…。虽然那是 2 年前的事了 - 它仍然是同样的问题吗?
  • 是的,同样的问题。顺便说一句,您总是可以编写自己的 Authorize 并让它抛出一个带有 401 的 HttpException

标签: asp.net-mvc security forms-authentication roles authorize-attribute


【解决方案1】:

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

所以如果操作 i/Rate 具有属性 [Authorize] 那么

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

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

【讨论】:

  • 对我来说听起来像是一个错误 - 我只是完全无辜地将 ReturnUrl 添加到需要授权的 URL 中,我得到了 401 - 你的回答对我有帮助 - 谢谢!
  • 很高兴我的评论有帮助 ;)
【解决方案2】:

看到这个帖子... ASP.Net converts 401 to 302 error codes

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

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

【讨论】:

  • 是的,必须这样做。谢谢。
【解决方案3】:

如果未经授权的用户尝试访问标有 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?

【讨论】:

  • 是的,我想要 401,但我不想要重定向。如果他们已经过身份验证但未经授权,则不应将其带到登录页面。
【解决方案4】:

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

public void OnAuthorization(AuthorizationContext filterContext) {


if(//user does not have permission){

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

}

【讨论】:

  • 是的,我想到了,但我真的不想返回页面。我想返回一个 HTTP 401(通过 IIS)
猜你喜欢
  • 1970-01-01
  • 2019-05-11
  • 2012-03-31
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
相关资源
最近更新 更多