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

Asp.net mvc MVC顺序、优先级和功能问题中的授权属性,asp.net-mvc,authorization,roles,Asp.net Mvc,Authorization,Roles,有些角色我没有完全理解。使用[Authorize]属性 当控制器和操作上有[Authorize]属性时: 当一个角色同时处于这两个角色中时,该角色将具有访问权限 如果角色仅在控制器上定义,而未在操作上定义,则无法访问 如果角色仅在操作中定义,而未在控制器中定义,则无法访问 我明白了,这是合乎逻辑的。在运行操作之前,您需要访问控制器 我不明白的是为什么这不起作用: [Authorize(Roles = "Algemeen Beheer, Admin, Coordinator, Secretaria

有些角色我没有完全理解。使用
[Authorize]
属性

当控制器和操作上有
[Authorize]
属性时:

  • 当一个角色同时处于这两个角色中时,该角色将具有访问权限
  • 如果角色仅在控制器上定义,而未在操作上定义,则无法访问
  • 如果角色仅在操作中定义,而未在控制器中定义,则无法访问
  • 我明白了,这是合乎逻辑的。在运行操作之前,您需要访问控制器

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

    [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
    身份登录时,我可以访问控制器,但无法访问创建操作。
    我认为这将是
    用户
    角色
    之间的OR关系。不是吗?如何使其工作?

    在控制器级别指定的
    [Authorize]
    是默认值,在没有为单个操作方法指定
    [Authorize]
    时使用

    这两种方法不能协同工作,只有一种方法会被执行

    如果在
    [Authorize]
    筛选器中同时指定用户和角色,则必须满足这两个条件才能允许访问该方法


    因此它是一个ANDnot OR。

    访问Create方法的条件是:

    ((在{Algemeen Beheer,管理员, 协调人、秘书处(}))[来自主计长级别]和 ({Stefan.coordinator}中的用户)和 (在{Algemeen Beheer,Admin}中的角色)[从方法级别]

    一旦完成所有AND/OR,结果就是:

    {Stefan.coordinator}中的用户和{Algemeen Beheer,Admin}中的角色

    也就是说,在一个特定的属性中,用户和角色被合并在一起。在多个属性之间,条件被合并在一起

    考虑这一点的最佳方式是,[Authorize]属性彼此不知道,因此每个属性都独立执行。首先是控制器级别1,然后是方法级别1。要访问该方法,您需要通过所有门

    编辑-有一个关于逻辑如何像上面那样工作的问题

    让我们:

    由于控制器级别的[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方法。这样您可以说如果(User==“Stefan.coordinator”| base.AuthorizeCore(…){…})。

    也许我没有遵循您的逻辑,为什么
    ((User in{Stefan.coordinator})
    被淘汰?@Nathan-我已经发布了一个澄清。请让我知道这是否回答了您的问题!您的等式中有一个错误。它似乎是({Stefan.coordinator}中的用户)和({Algemeen Beheer,Admin}中的角色))[从方法级别]因为没有其他用户可以在有此用户tagBah的情况下访问该操作,所以不敢相信我忘记了该代码是如何工作的。---更新答案。[编辑以前的注释]这是不正确的。所有[Authorize]属性(控制器和方法)都被执行。
    A = ROLE is "Algemeen Beheer"
    B = ROLE is "Admin"
    C = ROLE is "Coordinator"
    D = ROLE is "Secretariaat"
    E = USER is "Stefan.coordinator"