即使指定了 JWT 身份验证,也未指定任何身份验证方案错误

San*_*mas 0 c# jwt asp.net-web-api azure-active-directory .net-core

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

        });
Run Code Online (Sandbox Code Playgroud)

我希望我的客户端应用程序 (Angular) 将在其请求中附加 Authorization 标头,因此它可以访问 API

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

InvalidOperationException: 未指定 authenticationScheme,也未找到 DefaultChallengeScheme。可以使用 AddAuthentication(string defaultScheme) 或 AddAuthentication(Action configureOptions) 设置默认方案。

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

sid*_*cus 8

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

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

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

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

如果未指定“AzureAd”参数,AddJwtBearer则会调用以下版本:

  builder.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, configureOptions);
Run Code Online (Sandbox Code Playgroud)

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