gpt4 book ai didi

asp.net-mvc - MVC中的授权属性顺序、优先级和功能问题

转载 作者:行者123 更新时间:2023-12-02 13:14:18 24 4
gpt4 key购买 nike

角色中有一些我不太理解的地方。使用[Authorize]属性

当您在 Controller 和操作上具有 [Authorize] 属性时:

  1. 当一个角色同时存在于两者中时,该角色将具有访问权限
  2. 当角色仅在 Controller 中定义,但在操作中未定义时,无访问权限
  3. 当角色仅在操作中定义,但在 Controller 中未定义时,无访问权限

我明白了,这是合乎逻辑的。您需要先访问 Controller ,然后才能运行操作。

我不明白的是为什么这不起作用:

[Authorize(Roles = "Algemeen Beheer, Admin, Coordinator, Secretariaat")]
public class FacturatieGegevensController : Controller {

[Authorize(Users = "Stefan.coordinator", Roles = "Algemeen Beheer, Admin")]
public ActionResult Create(int instID) {

return View();
}

}

当我以具有协调员角色的用户 Stefan.coordinator 身份登录时,我可以访问 Controller ,但无法访问访问创建操作。我认为这将是 UsersRoles 之间的 OR 关系。不是吗?我该如何让它发挥作用?

最佳答案

访问Create方法的条件是:

((ROLE in { Algemeen Beheer, Admin, Coordinator, Secretariaat })) [from controller-level] AND ((USER in { Stefan.coordinator }) AND (ROLE in { Algemeen Beheer, Admin })) [from method-level]

一旦计算出所有 AND/OR,结果就很简单:

USER in { Stefan.coordinator } AND ROLE in { Algemeen Beheer, Admin }

也就是说,在特定的 AuthorizeAttribute 中,用户和角色是 AND 在一起的。在多个 AuthorizeAttribute 中,条件是通过 AND 组合在一起的。

最好的思考方式是,[Authorize] 属性彼此不知道,因此每个属性都独立执行。首先是 Controller 级的,然后是方法级的。要访问该方法,您需要通过所有门。

编辑 - 有一个关于上面的逻辑如何运作的问题。

让:

A = ROLE is "Algemeen Beheer"
B = ROLE is "Admin"
C = ROLE is "Coordinator"
D = ROLE is "Secretariaat"
E = USER is "Stefan.coordinator"

由于 Controller 级[Authorize]属性为(A || B || C || D),因此方法级[Authorize]属性为(E && (A || B)),并且多个[Authorize] ] 属性由逻辑 AND 表示,逻辑最终为 (A || B || C || D) && (E && (A || B)),可简化为 E && (A || B),这要求用户名为“Stefan.coordinator”并且具有“Algemeen Beheer”或“Admin”角色。由于用户 Stefan.coordinator 不属于这两个角色中的任何一个,因此检查失败。

针对您的特定问题..

如果您想将自己的逻辑应用于 [Authorize] 属性检查,请子类化 AuthorizeAttribute 并重写 AuthorizeCore 方法。这样你就可以说 if (User == "Stefan.coordinator"|| base.AuthorizeCore(...)) { ... }.

关于asp.net-mvc - MVC中的授权属性顺序、优先级和功能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4672058/

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