在ASP.NET MVC中自定义授权

时间:2009-01-09 10:17:06

标签: asp.net-mvc security authorization

我的Controller类使用AuthorizeAttribute进行修饰以保护操作:

[Authorize(Roles = "User Level 2")]
public class BuyController : Controller
{
    ...
}

无论何时调用某个操作但用户至少不是“用户级别2”角色,他会自动重定向到登录页面,其中包含以下网址:

http://localhost:1436/Account/Login?ReturnUrl=%2fBuy

如果用户已登录但没有正确的安全级别,则这不是最佳行为!显示一个页面会更有意义,该页面通知用户缺少的级别,而不是显示登录页面。

如何自定义此行为? 是否可以以某种方式将所需的用户级别传递给Login操作?

2 个答案:

答案 0 :(得分:38)

您可以构建自己的授权属性,如下所示:

public class ClubAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
  base.OnAuthorization(filterContext);
  if (filterContext.Cancel && filterContext.Result is HttpUnauthorizedResult)
  {
    filterContext.Result = new RedirectToRouteResult(
      new RouteValueDictionary {
      { "clubShortName", filterContext.RouteData.Values[ "clubShortName" ] },
      { "controller", "Account" },
      { "action", "Login" },
      { "ReturnUrl", filterContext.HttpContext.Request.RawUrl }
    });
  }
}
}

我用它来重定向到我正在建设的俱乐部会员网站中的特定俱乐部。你可以根据自己的需要调整它。顺便说一句,在我的情况下,我会重定向到登录页面,但我检查用户是否已获得授权,如果是,则显示一条消息,表明他们没有正确的权限。毫无疑问,您还可以在页面上显示要向ViewData或TempData添加的内容,但我还没有尝试过

修改 在RC中,AuthorizationContext.Cancel不再存在。 “filterContext.Result是HttpUnauthorizedResult”似乎已经足够了:What happened to filterContext.Cancel (ASP.NET MVC)

答案 1 :(得分:1)

自上次回答以来,时间已经过去了很久。

自2009年以来,授权领域取得了很大进展。特别是,OASIS(SAML背后的人)已经标准化了XACML,即可扩展访问控制标记语言。

XACML为开发人员提供:

  • 使用模式
  • 一个架构
  • 灵活的授权政策语言

XACML符合基于属性的访问控制,NIST建议现在在应用程序中采用这种访问控制。

有关详细信息,请查看此answer