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。仍然为什么它不接受?
请从 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 身份验证。