C# 未指定authenticationScheme错误,即使指定了JWT身份验证

C# 未指定authenticationScheme错误,即使指定了JWT身份验证,c#,asp.net-web-api,.net-core,jwt,azure-active-directory,C#,Asp.net Web Api,.net Core,Jwt,Azure Active Directory,我是AzureAD认证的新手。我在startup.cs中使用以下设置设置Web API services.AddAuthentication(sharedopt => sharedopt.DefaultScheme = JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer("AzureAd", options => { options.Au

我是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")
            };

        });
services.AddAuthentication(sharedopt=>sharedopt.DefaultScheme=JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(“AzureAd”,选项=>
{
options.audition=Configuration.GetValue(“AzureAd:audition”);
options.Authority=Configuration.GetValue(“AzureAd:Instance”)
+GetValue(“AzureAd:TenantId”);
options.TokenValidationParameters=新的Microsoft.IdentityModel.Tokens.TokenValidationParameters()
{
ValidIssuer=Configuration.GetValue(“AzureAd:Issuer”),
Validudience=Configuration.GetValue(“AzureAd:Audience”)
};
});
我希望我的客户端应用程序(Angular)将在其请求中附加授权头,从而访问API

但是,当我执行Web API并尝试使用Authorize打开任何API时,它会触发此错误

InvalidOperationException:未指定任何authenticationScheme,并且 没有找到DefaultChallengeScheme。默认方案可以是 使用AddAuthentication(字符串defaultScheme)或 添加身份验证(操作配置选项)

我已经指定了JWTBearerDefaults.AuthenticationScheme。为什么不接受?

请从AddJwtBearer调用中删除第一个“AzureAd”参数

TLDR:调用AddAuthentication时,将默认方案设置为
JwtBearerDefaults.AuthenticationScheme
,即字符串“Bearer”

这告诉身份验证中间件对所有请求进行身份验证(除非另有规定,例如,通过方案的授权属性),以使用由shceme名称“Bearer”组织的一组处理程序和配置。 但是你没有注册这个计划。您对
AddJwtBerer
的调用注册了一个名为“AzureAd”的方案

身份验证中间件找不到匹配的方案,因此出现错误

如果未指定“AzureAd”参数,将调用以下版本的
AddJwtBearer

  builder.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, configureOptions);

正如我们所看到的,它使用与默认方案匹配的方案“Bearer”注册JwtBearer身份验证。

我遇到了同样的问题,这为我解决了这个问题。非常感谢你。