在ASP.NET MVC中自定义授权

26

我的Controller类被授权过滤器(AuthorizeAttribute)装饰以保护其操作:

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

每当一个操作被调用,但是用户至少不在"User Level 2"角色中时,用户会自动重定向到登录页面,URL类似于:

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

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

我该如何自定义此行为?

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


1
这里有另一个答案:https://dev59.com/9nM_5IYBdhLWcg3waieJ - user969533
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" 似乎已经足够了:What happened to filterContext.Cancel (ASP.NET MVC)

11
filterContext似乎没有Cancel成员。我有没有错过某些扩展方法? - pupeno

1

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

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

XACML为开发人员提供:

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

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

查看answer获取更多详细信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接