代码之家  ›  专栏  ›  技术社区  ›  FantaMango77

ASP.NET MVC中的自定义授权

  •  26
  • FantaMango77  · 技术社区  · 16 年前

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

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

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

    如何自定义此行为?

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

    2 回复  |  直到 4 年前
        1
  •  38
  •   Community Michael Schmitz    7 年前

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

    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”似乎足够了: What happened to filterContext.Cancel (ASP.NET MVC)

        2
  •  1
  •   Community Michael Schmitz    7 年前

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

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

    • 使用模式
    • 建筑

    XACML与基于属性的访问控制一致,NIST建议在当前的应用中采用这种访问控制。

    answer 更多细节。