Azure App Service调用身份端点12小时后出现429错误及超时问题
我有一个每秒被多次调用的Azure App Service,通过托管身份连接Azure SQL Database。应用正常运行约12小时后,调用login.microsoftonline.../well-known...的请求开始出现超时或耗时极久的情况,导致系统严重卡顿。后续接入的请求都会尝试调用该URL获取刷新令牌,所有请求耗时均超过30秒并返回429 HTTP错误码。我未在代码中做特殊配置,因为理解刷新令牌逻辑应由对应库自动处理。
代码片段:
private static void ConfigureAzureIdentityAuthentication(this IServiceCollection services, IConfiguration configuration) { var userAssignedManagedIdentity = configuration.GetValue<string?>("UserAssignedManagedIdentity"); //Managed Identities handlers - User Assigned Managed Identity services.AddAzureClients(clientBuilder => { if (!string.IsNullOrEmpty(userAssignedManagedIdentity)) { DefaultAzureCredential defaultAzureCredential = new( new DefaultAzureCredentialOptions { ManagedIdentityClientId = userAssignedManagedIdentity }); clientBuilder.UseCredential(defaultAzureCredential); } }); }
你遇到的是高并发长期运行场景下,托管身份令牌获取环节的限流或缓存失效问题,以下是可行的解决方向:
优化令牌缓存策略
DefaultAzureCredential默认会缓存令牌,但高并发多实例场景下可能存在缓存复用不足的情况。确保DefaultAzureCredential在DI容器中以单例模式注册(你的代码中通过AddAzureClients注册的客户端默认是单例,对应凭据也会被复用),还可以配置持久化缓存增强跨实例共享:var cacheOptions = new TokenCachePersistenceOptions { Name = "SqlManagedIdentityCache" }; DefaultAzureCredential defaultAzureCredential = new( new DefaultAzureCredentialOptions { ManagedIdentityClientId = userAssignedManagedIdentity, TokenCachePersistenceOptions = cacheOptions });调整重试与限流参数
针对429错误,通过配置重试规则避免短时间内大量重复请求加剧限流,同时禁用不必要的身份验证方法减少无效请求:DefaultAzureCredential defaultAzureCredential = new( new DefaultAzureCredentialOptions { ManagedIdentityClientId = userAssignedManagedIdentity, Retry = { MaxRetries = 3, Delay = TimeSpan.FromSeconds(1), MaxDelay = TimeSpan.FromSeconds(8), Mode = RetryMode.Exponential }, ExcludeInteractiveBrowserCredential = true, ExcludeVisualStudioCredential = true, ExcludeAzureCliCredential = true });升级Azure.Identity库版本
旧版本的Azure.Identity存在令牌刷新逻辑缺陷,比如未正确处理缓存过期、频繁调用元数据端点等问题。将Azure.IdentityNuGet包升级到1.10.0及以上的最新稳定版,可修复已知的此类问题。检查网络访问配置
如果App Service部署在VNet中,确认出站规则允许访问login.microsoftonline.com(HTTPS 443端口)。可以在App Service的Kudu控制台执行curl -v https://login.microsoftonline.com/tenant-id/.well-known/openid-configuration测试连通性,排查DNS解析、响应时间是否正常,同时检查防火墙、应用网关是否有速率限制规则拦截请求。使用SQL专用身份验证提供器
针对Azure SQL场景,使用专门的身份验证提供器可减少对通用端点的依赖,优化令牌获取流程:using Microsoft.Data.SqlClient; using Azure.Identity; // 应用启动时注册 SqlAuthenticationProvider.SetProvider( SqlAuthenticationMethod.ActiveDirectoryManagedIdentity, new ActiveDirectoryManagedIdentitySqlAuthenticationProvider(userAssignedManagedIdentity));之后SQL连接字符串可直接使用
Authentication=Active Directory Managed Identity参数,无需通过AddAzureClients配置通用凭据。
内容的提问来源于stack exchange,提问作者mehdi bennie

