在ASP.NET MVC中定制授权

我的控制器类用一个AuthorizeAttribute装饰来保护操作:

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

任何时候都会调用一个动作,但用户至少不是“用户级别2”角色,他会自动使用类似下面的url重定向到登录页面:

HTTP://本地主机:1436 /帐号/登录RETURNURL =%2fBuy

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

我能做些什么来定制这种行为? 是否有可能以某种方式将所需的用户级别传递给登录操作?


你可以像这样构建你自己的授权属性:

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在页面上显示,但我没有尝试过

编辑 AuthorizationContext.Cancel在RC中不再存在。 “filterContext.Result是HttpUnauthorizedResult”似乎已经足够了:filterContext.Cancel发生了什么(ASP.NET MVC)


自上次回答以来,时间早已过去。

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

XACML为开发人员提供:

  • 一种使用模式
  • 一个建筑
  • 灵活的授权策略语言
  • XACML符合NIST建议在当今应用中采用的基于属性的访问控制。

    有关更多详细信息,请参阅此答案。

    链接地址: http://www.djcxy.com/p/71797.html

    上一篇: Customizing authorization in ASP.NET MVC

    下一篇: Handling session timeouts in ajax calls