ASP.NET Core控制器用Azure AD与Azure AD B2C授权后警告问题咨询
问题分析与解决方案
不建议直接忽略这些警告。虽然当前接口能正常响应,但该日志说明认证中间件在处理请求时,会尝试用错误的认证方案验证令牌,验证失败后才切换到正确的方案,这种"冗余验证"不仅会污染日志,还可能在后续功能扩展时引发未预期的认证问题。
问题根源
你配置了两个独立的认证方案:
- 默认的
Bearer方案对应Azure AD认证 B2CScheme对应Azure AD B2C认证
当请求B2C保护的接口时,认证中间件会遍历已注册的认证方案,先尝试用Bearer方案验证B2C令牌,由于Azure AD的合法签发者与B2C令牌的签发者不匹配,就会抛出IDX40001警告,之后才会用B2CScheme完成正确的验证,因此接口能正常工作但日志会出现错误信息。
解决方法
1. 明确每个认证方案的合法签发者(推荐)
通过配置每个认证方案的TokenValidationParameters.ValidIssuers,让中间件只验证对应签发者的令牌,避免交叉验证:
// 配置Azure AD的Bearer方案 services.AddMicrosoftIdentityWebApiAuthentication(this.Configuration) .EnableTokenAcquisitionToCallDownstreamApi() .AddInMemoryTokenCaches() .Configure(options => { // 替换为你的Azure AD租户签发者地址 options.TokenValidationParameters.ValidIssuers = new[] { "https://login.microsoftonline.com/{你的AzureAD租户ID}/v2.0" }; }); // 配置Azure AD B2C的B2CScheme方案 services.AddAuthentication() .AddMicrosoftIdentityWebApi(this.Configuration, "AzureAdB2C", "B2CScheme", true) .Configure(options => { // 替换为你的B2C租户签发者地址 options.TokenValidationParameters.ValidIssuers = new[] { "https://{你的B2C租户名称}.b2clogin.com/{你的B2C租户ID}/v2.0/" }; });
2. 过滤冗余日志(临时方案)
如果暂时无法修改代码,可通过调整日志配置,将该类警告日志过滤掉,仅保留错误级别以上的日志:
在appsettings.json中添加日志过滤规则:
"Logging": { "LogLevel": { "Microsoft.IdentityModel.LoggingExtensions.IdentityLoggerAdapter": "Error" } }
总结
优先选择第一种方法从根源解决问题,避免后续潜在的认证风险;第二种方法仅作为临时过渡方案,不建议长期使用。
内容的提问来源于stack exchange,提问作者Pat Long - Munkii Yebee
相关产品推荐
相关产品推荐

