26

我的 Controller 类装饰有 AuthorizeAttribute 以保护操作:

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

任何时候调用操作,但用户至少不是“用户级别 2”角色,用户会自动重定向到登录页面,其 URL 如下所示:

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

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

我可以做些什么来自定义这种行为?

是否可以以某种方式将所需的用户级别传递给登录操作?

4

2 回答 2

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 添加一些内容以显示在页面上,但我还没有尝试过

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

于 2009-01-09T14:38:23.357 回答
1

距离上一次回答,时间已经过去很久了。

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

XACML 为开发人员提供:

  • 使用模式
  • 架构
  • 灵活的授权策略语言

XACML 符合 NIST 建议在当今应用中采用的基于属性的访问控制。

请查看此答案以获取更多详细信息。

于 2014-03-20T20:45:51.717 回答