在ASP.NET MVC中自定义授权

问题描述 投票:26回答:2

我的Controller类被装饰了一个AuthorizeAttribute来保护动作。

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

任何时候,当一个动作被调用,但用户至少不是 "用户2级 "角色时,用户会被自动重定向到登录页面,URL如下:

http:/localhost:1436AccountLogin?ReturnUrl=%2fBuy。

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

我可以怎么做来定制这个行为?

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

asp.net-mvc security authorization
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中添加一些东西来显示在页面上,但我还没有试过。

编辑RC中已经不存在AuthorizationContext.Cancel了。"filterContext.Result is HttpUnauthorizedResult "似乎已经足够了。filterContext.Cancel(ASP.NET MVC)怎么了?


1
投票

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

自2009年以来,在授权领域取得了很多进展。特别是,OASIS(SAML背后的那些)已经标准化了XACML,即eXtensible Access Control Markup Language。

XACML给开发者提供了

  • 一个使用模式
  • 建筑学
  • 灵活的授权政策语言

XACML与NIST推荐的基于属性的访问控制是一致的。

请看一下这个 回答 更多细节。

© www.soinside.com 2019 - 2024. All rights reserved.