已部署API出现426(InvalidRequest)错误,求微软认证相关解决方案
问题描述
我方API此前运行正常,但自2023年5月31日起出现**426(InvalidRequest)**状态码错误,报错堆栈信息如下:
[HttpRequestException: Response status code does not indicate success:426 (InvalidRequest).]
System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode() +210
Microsoft.Owin.Security.ActiveDirectory.WsFedMetadataRetriever.GetSigningKeys(String metadataEndpoint, TimeSpan backchannelTimeout, HttpMessageHandler backchannelHttpHandler) +160
Microsoft.Owin.Security.ActiveDirectory.WsFedCachingSecurityTokenProvider.RetrieveMetadata() +423
Microsoft.Owin.Security.ActiveDirectory.WsFedCachingSecurityTokenProvider..ctor(String metadataEndpoint, ICertificateValidator backchannelCertificateValidator, TimeSpan backchannelTimeout, HttpMessageHandler backchannelHttpHandler) +361
Owin.WindowsAzureActiveDirectoryBearerAuthenticationExtensions.UseWindowsAzureActiveDirectoryBearerAuthentication(IAppBuilder app, WindowsAzureActiveDirectoryBearerAuthenticationOptions options) +163
Startup.ConfigureAuth(IAppBuilder app) in C:\Code\Release\API\App_Start\Startup.Auth.cs:13
API.Startup.Configuration(IAppBuilder app) in C:\Code\Release\API\Startup.cs:9
该错误大概率与微软Azure AD(现Microsoft Entra ID)认证层面的变更有关,以下是针对性调整方案:
调整步骤
1. 强制启用TLS 1.2协议
微软在2023年完成了对TLS 1.0/1.1的淘汰,AD元数据端点已不再支持旧版TLS协议。若API依赖的库默认使用旧版协议,会导致请求被拒绝返回426错误。
在Startup.cs的Configuration方法开头添加如下代码,强制设置TLS版本:
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
2. 更新元数据端点URL
旧版的AD WS-Federation元数据端点https://login.windows.net/{tenantId}/federationmetadata/2007-06/federationmetadata.xml已被逐步弃用,需切换到新版Microsoft Entra ID端点:
https://login.microsoftonline.com/{tenantId}/federationmetadata/2007-06/federationmetadata.xml
在Startup.Auth.cs中找到WindowsAzureActiveDirectoryBearerAuthenticationOptions的配置,更新MetadataAddress属性为上述新地址。
3. 升级相关依赖库版本
旧版Microsoft.Owin.Security.ActiveDirectory库可能不兼容微软最新的认证规则,需升级以下NuGet包至最新稳定版:
Microsoft.Owin.Security.ActiveDirectoryOwinMicrosoft.Owin及其他相关依赖包
4. 调整证书验证策略(排查用)
若元数据端点的SSL证书更新,旧版库的证书验证逻辑可能无法适配。可临时调整验证策略排查问题(生产环境建议保持严格验证):
在认证选项配置中添加证书验证器:
options.BackchannelCertificateValidator = new Microsoft.IdentityModel.Tokens.X509CertificateValidatorChain(); // 临时禁用验证(仅排查用,生产不推荐) // options.BackchannelCertificateValidator = ICertificateValidator.None;
内容的提问来源于stack exchange,提问作者Ganapathy A

