Authentication 同时使用多个方案授权ASP.NET Core 2.1控制器

Authentication 同时使用多个方案授权ASP.NET Core 2.1控制器,authentication,asp.net-core-2.1,authorize-attribute,multiple-schema,Authentication,Asp.net Core 2.1,Authorize Attribute,Multiple Schema,假设我们正在使用“Abc”模式和相应的处理程序进行身份验证,一切都很好。我们可以简单地使用 [授权(AuthenticationSchemes=“Abc”,Roles=“admin”)]属性 但现在似乎还需要能够使用“Xyz”模式保护控制器的端点(因此请求应该对应于两种方案的需求)。 因此,我认为注册新的模式和处理程序就足以使用[Authorize]如下并接收和逻辑: [Authorize(AuthenticationSchemes = "Abc", Roles = "admin")] [Aut

假设我们正在使用“Abc”模式和相应的处理程序进行身份验证,一切都很好。我们可以简单地使用

[授权(AuthenticationSchemes=“Abc”,Roles=“admin”)]
属性

但现在似乎还需要能够使用“Xyz”模式保护控制器的端点(因此请求应该对应于两种方案的需求)。 因此,我认为注册新的模式和处理程序就足以使用
[Authorize]
如下并接收
逻辑:

[Authorize(AuthenticationSchemes = "Abc", Roles = "admin")]
[Authorize(AuthenticationSchemes = "Xyz")]
public class UserController : ControllerBase 
{
}
但是,对控制器的有效请求会导致“禁止”响应状态(请注意,即使在“未授权”状态下也不会)

此外,我还发现有趣的是,当我们在action方法而不是controller上应用
[Authorize(AuthenticationSchemes=“Xyz”)]
时,一切都会按预期运行

注意:
mvcopions.AllowCombiningAuthorizeFilters
Startup
中已设置为
false

我猜想,当两个属性都在同一级别(在本例中为控制器)时,它仍然以某种方式合并了授权逻辑

有人知道我错过了什么吗? 可能我的想法是错误的,有一种合适的方法来进行多模式身份验证
所以,请随时提供您的想法。

我想这可能已经得到了回答

当您看到像在本例中这样的复杂授权属性时,基于策略的授权可以帮助保持事物的可维护性和简单性

最终使用策略的结果是

services.AddAuthorization(options =>
{
    options.AddPolicy("MyPolicy", policy =>
    {
        policy.RequireAuthenticatedUser();
        policy.RequireRole("Admin");
        policy.AddAuthenticationSchemes("Abc", "Xyz");
    });
});
你可以用你的控制器或者它的任何方法来装饰你的控制器

[Authorize(Policy = "MyPolicy")]
也可以查看一下,了解它是如何完成的,以及它可以为您提供什么