【问题标题】:Authorize ASP.NET Core 2.1 controller with several schemes at once一次使用多个方案授权 ASP.NET Core 2.1 控制器
【发布时间】:2019-02-24 16:25:33
【问题描述】:

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

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

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

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

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

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

P.S:Startup 中的 MvcOptions.AllowCombiningAuthorizeFilters 已设置为 false

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

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

【问题讨论】:

    标签: authentication asp.net-core-2.1 authorize-attribute multiple-schema


    【解决方案1】:

    我想这可能已经回答了here

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

    您最终会使用策略类似于

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

    你可以装饰你的控制器或它的任何方法,只不过

    [Authorize(Policy = "MyPolicy")]
    

    请查看official docs,了解它是如何完成的以及它可以为您提供什么。

    【讨论】:

      猜你喜欢
      • 2018-06-02
      • 1970-01-01
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      • 2018-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多