即使指定了 JWT 身份验证,也没有指定身份验证方案错误
Posted
技术标签:
【中文标题】即使指定了 JWT 身份验证,也没有指定身份验证方案错误【英文标题】:No authenticationScheme was specified error even when JWT Authentication Specified 【发布时间】:2020-10-22 03:09:01 【问题描述】:我是 AzureAD 身份验证的新手。我在 startup.cs 中使用以下设置设置了我的 Web API
services.AddAuthentication(sharedopt => sharedopt.DefaultScheme = JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer("AzureAd", options =>
options.Audience = Configuration.GetValue<string>("AzureAd:Audience");
options.Authority = Configuration.GetValue<string>("AzureAd:Instance")
+ Configuration.GetValue<string>("AzureAd:TenantId");
options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters()
ValidIssuer = Configuration.GetValue<string>("AzureAd:Issuer"),
ValidAudience = Configuration.GetValue<string>("AzureAd:Audience")
;
);
我希望我的客户端应用程序 (Angular) 将在其请求中附加授权标头,因此它将获得对 API 的访问权限
但是当我执行 Web API 并尝试使用 Authorize 打开任何 API 时,它会触发此错误
InvalidOperationException:未指定 authenticationScheme,并且 没有找到 DefaultChallengeScheme。默认方案可以是 使用 AddAuthentication(string defaultScheme) 或 AddAuthentication(Action configureOptions)。
我已经指定了 JWTBearerDefaults.AuthenticationScheme。还是为什么不接受?
【问题讨论】:
【参考方案1】:您可能错过了注册 services.ConfigureApiAuthentication(Configuration);在启动类中
【讨论】:
【参考方案2】:请从 AddJwtBearer 调用中删除第一个“AzureAd”参数。
TLDR:当您调用 AddAuthentication 时,您将默认方案设置为 JwtBearerDefaults.AuthenticationScheme
,即字符串“Bearer”。
这告诉身份验证中间件对所有请求进行身份验证(除非另有说明,例如通过带有方案的 Authorize 属性)以使用一组由名称“Bearer”组织的处理程序和配置。
但是,您没有注册该方案。您对AddJwtBerer
的调用会注册一个名为“AzureAd”的方案。
身份验证中间件找不到匹配的方案,因此出现错误。
如果不指定“AzureAd”参数,则调用以下版本的AddJwtBearer
:
builder.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, configureOptions);
如我们所见,它使用与您的默认方案匹配的方案“Bearer”注册 JwtBearer 身份验证。
【讨论】:
我遇到了同样的问题,这为我解决了。非常感谢。以上是关于即使指定了 JWT 身份验证,也没有指定身份验证方案错误的主要内容,如果未能解决你的问题,请参考以下文章
使用 JSON Web Token (JWT) 进行身份验证和授权