Azure托管.NET Core应用使用Azure AD单租户认证出现登录登出循环问题
问题根因
该现象是.NET Core默认的Data Protection密钥配置缺陷导致的会话冲突:
Azure托管的.NET Core应用默认将加密认证Cookie的Data Protection密钥存储在进程内存中,每次发布新版本、应用重启、实例扩容时,原有密钥会被自动重置。旧的用户登录Cookie无法被新密钥解析,应用会强制触发重新认证,而Azure AD侧仍保留用户的登录态,二者冲突就会出现反复要求登录、登出的死循环。
开发侧永久解决方案
完成以下配置后,后续发布新版本不会再出现该问题:
- 配置Data Protection密钥持久化存储,避免发布后密钥丢失
在Program.cs中添加如下配置,将密钥存储到Azure Blob Storage,同时可搭配Azure Key Vault做密钥加密:
using Azure.Identity; using Microsoft.AspNetCore.DataProtection; // 省略其他配置代码 builder.Services.AddDataProtection() // 将密钥持久化到Azure Blob存储 .PersistKeysToAzureBlobStorage(new Uri("<你的Blob存储容器对应的SAS URI>")) // 可选:用Azure Key Vault加密存储的密钥,提升安全性 .ProtectKeysWithAzureKeyVault(new Uri("<你的Key Vault中加密密钥的URI>"), new DefaultAzureCredential());
- 固定认证Cookie名称,避免系统随机生成Cookie名导致的会话识别异常
using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.Identity.Web; // 省略其他配置代码 builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd")) .EnableTokenAcquisitionToCallDownstreamApi() .AddInMemoryTokenCaches(); // 固定认证Cookie配置 builder.Services.Configure<CookieAuthenticationOptions>(CookieAuthenticationDefaults.AuthenticationScheme, options => { options.Cookie.Name = "YourAppName.Auth.Cookie"; options.Cookie.SameSite = SameSiteMode.Lax; options.SlidingExpiration = true; });
非IT终端用户临时规避方法
以下方法操作简单,按步骤执行即可立刻解决问题:
- 【推荐 1分钟完成】使用浏览器隐私/无痕模式访问
打开Chrome/Edge浏览器后,按快捷键Ctrl + Shift + N(苹果Mac系统按Command + Shift + N)打开无痕窗口,直接输入应用地址登录即可。 - 【不影响其他网站数据】仅清除当前应用相关的Cookie
- 打开出现登录问题的应用页面,点击浏览器地址栏最左侧的「锁形图标」
- 在弹出的菜单中选择「Cookie」选项
- 选中所有和当前应用域名、
microsoftonline.com相关的条目,点击删除 - 关闭浏览器重新打开,访问应用即可正常登录
- 【零操作成本】更换其他浏览器访问
如果你平时用Chrome访问该应用,换成Edge/Firefox即可直接正常登录。
内容的提问来源于stack exchange,提问作者huffmaster
相关产品推荐
相关产品推荐

