gpt4 book ai didi

asp.net-mvc - Asp.net MVC4 : Authorize on both controller and action

转载 作者:行者123 更新时间:2023-12-03 05:23:18 24 4
gpt4 key购买 nike

如果我在 Controller 和 Action 上都有 Authorize 属性,哪个会生效?还是两者都会生效?

最佳答案

你问:

If I have Authorize attribute on both controller and action, which one will take the effect? Both?


简单地回答这个问题:两者都有。效果是将 AND这两个限制放在一起。我将在下面解释为什么...
详情
因此,您可能会问这个问题有几个原因。
  • 与方法相比,您想知道如何对 Action 实现额外的约束。例如
  • 在 Controller 级别,强制用户角色为“用户”
  • 在操作级别,另外强制用户扮演“admin”角色

  • 您想在 Action 级别替换 Controller 约束
  • 您希望在操作级别删除 Controller 约束并使匿名用户可以使用该方法

  • 您没有指定您的 MVC 版本,因此我将假定为今天的最新版本(MVC 4.5)。但是,即使您使用的是 MVC 3,这也不会改变答案。 [Anonymous] 覆盖 Controller [Authorize](情况 3)
    案例 3. 我不需要覆盖(使用 [AllowAnonymous] ),因为它已经回答了 all over SOall over the web 。我只想说:如果你在一个 Action 上指定 [AllowAnonymous] 它将使该 Action 公开,即使 Controller 上有 [Authorize]
    您还可以使整个网站都受到 using a global filter 的授权,并在要公开的少数操作或 Controller 上使用 AllowAnonymous[Authorize] 是可加的(情况 1)
    情况 1 很简单。以下面的 Controller 为例:
    [Authorize(Roles="user")]
    public class HomeController : Controller {
    public ActionResult AllUsersIndex() {
    return View();
    }

    [Authorize(Roles = "admin")]
    public ActionResult AdminUsersIndex() {
    return View();
    }
    }
    默认情况下, [Authorize(Roles="user")] 使 Controller 中的所有操作仅可用于“用户”角色中的帐户。因此,要访问 AllUsersIndex,您必须处于“用户”角色。但是,要访问 AdminUsersIndex,您必须同时处于“用户”和“管理员”角色中。例如:
  • UserName: Bob, Roles: user, 不能 访问 AdminUsersIndex ,但可以访问 AllUsersIndex
  • 用户名:Jane,角色:admin, 不能 访问 AdminUsersIndexAllUsersIndex
  • 用户名:Tim,角色:user & admin, 可以 访问 AdminUsersIndexAllUsersIndex

  • 这说明 [Authorize] 属性是可加的。属性的 Users 属性也是如此,它可以与 Roles 结合使用以使其更具限制性。
    这种行为是由于 Controller 和 Action 属性的工作方式造成的。属性链接在一起并应用在订单 Controller 然后是 Action 中。如果第一个拒绝授权,则控制返回并且不调用 Action 的属性。如果第一个通过授权,那么第二个也会被检查。您可以通过指定 Order (例如 [Authorize(Roles = "user", Order = 2)] )来覆盖此顺序。
    覆盖 [Authorize](案例 2)
    情况 2 比较棘手。回想一下, [Authorize] 属性的检查顺序是(全局然后) Controller 然后是 Action 。第一个检测到用户没有资格获得授权的人获胜,其他人不会被调用。
    解决此问题的一种方法是定义两个新属性,如下所示。 [OverrideAuthorize] 除了遵从 [Authorize] 之外什么都不做;它的唯一目的是定义一个我们可以检查的类型。 [DefaultAuthorize] 允许我们检查请求中调用的 Action 是否用 [OverrideAuthorize] 修饰。如果是,那么我们将遵循 Action 授权检查,否则我们继续进行 Controller 级别检查。
    public class DefaultAuthorizeAttribute : AuthorizeAttribute {
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
    var action = filterContext.ActionDescriptor;
    if (action.IsDefined(typeof(OverrideAuthorizeAttribute), true)) return;

    base.OnAuthorization(filterContext);
    }
    }
    public class OverrideAuthorizeAttribute : AuthorizeAttribute {
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
    base.OnAuthorization(filterContext);
    }
    }
    然后我们可以像这样使用它:
    [DefaultAuthorize(Roles="user")]
    public class HomeController : Controller {
    // Available to accounts in the "user" role
    public ActionResult AllUsersIndex() {
    return View();
    }
    // Available only to accounts both in the "user" and "admin" role
    [Authorize(Roles = "admin")]
    public ActionResult AdminUsersIndex() {
    return View();
    }
    // Available to accounts in the "superuser" role even if not in "user" role
    [OverrideAuthorize(Roles = "superuser")]
    public ActionResult SuperusersIndex() {
    return View();
    }
    }
    在上面的示例中, SuperusersIndex 可用于具有“ super 用户”角色的帐户,即使它没有“用户”角色。

    关于asp.net-mvc - Asp.net MVC4 : Authorize on both controller and action,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16709853/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com