我度过了令人困惑的时间,试图使似乎似乎应该可行的东西工作,但也许我误解了一些基本知识。
我们用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用于承载令牌。
谢谢!