即使指定了 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 身份验证,也没有指定身份验证方案错误的主要内容,如果未能解决你的问题,请参考以下文章

WebApi_基于Token的身份验证——JWT(z)

使用 JSON Web Token (JWT) 进行身份验证和授权

iOS开发 - 基于Token的身份验证-JWT

使用 passport-jwt 进行 JWT 身份验证不考虑到期日期

Spring Security jwt 身份验证

没有数据库的 Laravel 中的 JWT 身份验证