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

多实例AKS环境下MVC+Blazor集成MSAL.NET调用GraphApi遇重定向循环

问题排查与解决方案

核心原因分析

多实例环境下出现重定向循环,本质是会话状态或MSAL令牌缓存未在实例间共享,导致每个实例无法识别已登录用户的状态,反复触发授权重定向;同时可能存在会话配置、负载均衡粘性或令牌缓存配置的疏漏。


具体排查与修复步骤

1. 完善分布式会话配置

你已调用AddSession(),但未配置分布式会话存储,多实例下默认的内存会话无法共享,每个实例都会认为用户未登录,触发重定向。

修改program.cs,添加分布式会话存储配置(复用已有的Azure Table Storage缓存):

// 在AddDistributedAzureTableStorageCache之后添加
builder.Services.AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromHours(2);
    options.Cookie.HttpOnly = true;
    options.Cookie.IsEssential = true;
    // 生产环境建议设置Cookie.SecurePolicy = CookieSecurePolicy.Always;
});

// 确保在UseRouting之前启用Session
app.UseSession();

2. 验证MSAL分布式令牌缓存配置

虽然配置了Azure Table Storage作为分布式令牌缓存,但需确认以下几点:

  • Azure Table Storage的连接字符串正确,所有实例都能访问该存储账户
  • 检查Pod日志中是否有Azure Table Storage的连接异常(如权限不足,需给AKS节点或Pod分配存储账户访问权限)
  • 显式绑定令牌缓存与分布式存储,避免序列化不一致:
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"))
    .EnableTokenAcquisitionToCallDownstreamApi(initialScopes)
    .AddMicrosoftGraph(builder.Configuration.GetSection("DownstreamApi"))
    .AddDistributedTokenCaches()
    .AddDistributedAzureTableStorageCache(options =>
    {
        options.ConnectionString = cacheOptions.ConnectionString;
        options.TableName = cacheOptions.TableName;
        options.PartitionKey = cacheOptions.PartitionKey;
        options.CreateTableIfNotExists = true;
        options.ExpiredItemsDeletionInterval = TimeSpan.FromHours(24);
    });

3. 配置AKS负载均衡的会话粘性

如果会话和令牌缓存配置正确,但请求仍在不同实例间跳转,需在AKS的Ingress或负载均衡器上启用会话粘性,确保同一用户的请求始终路由到同一个实例,避免跨实例状态不一致。

示例Ingress配置:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/affinity: "cookie"
    nginx.ingress.kubernetes.io/session-cookie-name: "route"
    nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
    nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"

4. 优化令牌获取与授权逻辑

你在控制器中同时使用[AuthorizeForScopes]和手动调用GetAccessTokenForUserAsync,两者可能冲突:

  • [AuthorizeForScopes]会自动处理令牌缺失,触发重定向
  • 手动捕获异常后未处理,导致未授权状态持续引发重定向

建议移除手动令牌获取,仅保留[AuthorizeForScopes]:

[AuthorizeForScopes(Scopes = new[] { "Application.ReadWrite.All", "Directory.Read.All", "Directory.ReadWrite.All" })]
public IActionResult UserManagement()
{
    // 无需手动获取令牌,[AuthorizeForScopes]会自动处理
    return View();
}

若必须手动获取令牌,需在捕获异常后正确触发授权重定向:

[Authorize]
public async Task<IActionResult> UserManagement()
{
    string[] scopes = new[] { "Application.ReadWrite.All", "Directory.Read.All", "Directory.ReadWrite.All" };
    try
    {
        await _tokenAcquisition.GetAccessTokenForUserAsync(scopes).ConfigureAwait(false);
    }
    catch (MsalUiRequiredException ex)
    {
        _telemetryClient.TrackException(ex);
        return Challenge(OpenIdConnectDefaults.AuthenticationScheme, new AuthenticationProperties { RedirectUri = Request.Path });
    }
    catch (Exception ex)
    {
        _telemetryClient.TrackException(ex);
        return StatusCode(500);
    }
    return View();
}

5. 检查Azure AD应用配置

确保Azure AD应用的重定向URI包含AKS环境的域名;同时确认应用权限已获得管理员同意,避免因权限不足导致令牌获取失败,引发重定向循环。


内容的提问来源于stack exchange,提问作者Annio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:27:30