You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.Identity NuGet包升级到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 16:49:58