3

让我们假设我们正在使用带有“Abc”模式和相应处理程序的身份验证,一切都很好。我们能够简单地保护控制器

[Authorize(AuthenticationSchemes = "Abc", Roles = "admin")]属性

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

[Authorize(AuthenticationSchemes = "Abc", Roles = "admin")]
[Authorize(AuthenticationSchemes = "Xyz")]
public class UserController : ControllerBase 
{
}

但相反,对控制器的有效请求会导致“禁止”响应状态(请注意,即使在“未授权”中)。

我也觉得有趣的是,当我们应用[Authorize(AuthenticationSchemes = "Xyz")]动作方法而不是控制器时 - 一切都按预期工作。

PS:MvcOptions.AllowCombiningAuthorizeFiltersinStartup已经设置为false.

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

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

4

1 回答 1

1

我想这可能已经在这里回答了。

当您在这种情况下看到复杂的授权属性时,基于策略的授权可以帮助保持事情的可维护性和简单性。

你最终会使用策略是这样的

services.AddAuthorization(options =>
{
    options.AddPolicy("MyPolicy", policy =>
    {
        policy.RequireAuthenticatedUser();
        policy.RequireRole("Admin");
        policy.AddAuthenticationSchemes("Abc", "Xyz");
    });
});

并且您将装饰您的控制器或其任何方法,只不过

[Authorize(Policy = "MyPolicy")]

还请查看官方文档以了解它是如何完成的以及它可以为您提供什么。

于 2018-09-25T07:15:11.143 回答