使用WebAPI和NetCore 2.1的多种身份验证方案和策略

时间:2020-02-27 21:53:20

标签: authentication .net-core authorization asp.net-core-webapi .net-standard

我度过了令人困惑的时间,试图使似乎似乎应该可行的东西工作,但也许我误解了一些基本知识。

我们用NetCore 2.1编写的服务支持可配置的身份验证。它同时支持ApiKey和Bearer Token身份验证。这些选项中的一个,两个或两个都不允许。

承载令牌认证还涉及一个策略,需要特定的范围。

ApiKey没有范围要求。

我发现,按照现在的设置方式,与承载身份验证相关的范围策略也正在ApiKey方案上强制执行,导致其无法授权,尽管已在ApiKey身份验证中进行了正确验证处理程序。

添加了策略和授权,如下所示:

services.AddAuthorization(options =>
                         {
                           options.AddPolicy("BearerPolicy", builder =>
                           {
                                builder.RequireScope("Scope");
                                builder.AddAuthenticationSchemes("Bearer"); // shouldn't this make the policy only apply to Bearer Auth?
                           });
                           options.AddPolicy("ApiKeyPolicy", builder =>
                           {
                                builder.RequireClaim(ClaimTypes.Name,"Default");
                                builder.AddAuthenticationSchemes("ApiKey"); // shouldn't this make the policy only apply to ApiKey Auth?
                           });        
                         });

添加了ApiKeyPolicy,以解决该问题。我不认为该政策需要制定。好像您认为的那样,“ AddAuthenticationSchemes”属性似乎并不使该策略仅专门应用于该身份验证类型。

需要进行身份验证/授权的控制器包含以下标记:

[Authorize(AuthenticationSchemes = "ApiKey", Policy = "ApiKeyPolicy")]
[Authorize(AuthenticationSchemes = "Bearer", Policy = "BearerPolicy")]

我认为此设置应允许ApiKey和Bearer身份验证,并根据所使用的策略应用正确的策略。

但是,似乎正在考虑所有策略,无论进行哪种身份验证。

这是设计使然,还是我遗漏了一些东西?我进入NetCore的授权代码,发现它始终具有所有策略,考虑到可以在策略和Authorize属性标签中指定身份验证方案的事实,我认为这是不对的。

我也可以提供更多信息。我想我已经给出了需要的部分。

我们将IdentityServer4用于承载令牌。

谢谢!

0 个答案:

没有答案