Azure AD DotnetCore SSO问题:登录一个Web应用引发另一个需重新认证
解决Azure AD + .NET Core Web应用跨应用SSO问题
你遇到的核心问题是两个同租户的Azure AD注册Web应用没有共享Azure AD的全局SSO会话,导致刷新应用时需要重新选择账户。本质是每个应用默认维护独立的本地Cookie会话,未正确关联Azure AD的SSO状态。
1. 调整OIDC认证中间件配置
在Program.cs(或Startup.cs)中,修改Azure AD认证的配置,确保应用利用Azure AD的SSO会话:
基础配置优化
// 注册认证服务 builder.Services.AddAuthentication(options => { options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; }) // 配置Cookie认证(处理本地会话) .AddCookie(options => { // 若两个应用跨域名部署(如app1.example.com、app2.example.com): // options.Cookie.Domain = ".example.com"; // 共享根域名下的Cookie options.Cookie.SameSite = SameSiteMode.None; // 允许跨站点Cookie传递 options.Cookie.SecurePolicy = CookieSecurePolicy.Always; // 仅HTTPS环境生效 }) // 配置Azure AD OIDC认证 .AddMicrosoftIdentityWebApp(options => { builder.Configuration.Bind("AzureAd", options); options.SaveTokens = true; // 保存令牌到本地会话,支持后续SSO options.UseTokenLifetime = true; // 让本地会话生命周期与Azure AD令牌同步 // 添加静默认证逻辑,避免重复选择账户 options.Events = new OpenIdConnectEvents { OnRedirectToIdentityProvider = context => { // 若用户已本地认证,尝试静默获取Azure AD会话 if (context.User.Identity?.IsAuthenticated == true) { context.ProtocolMessage.Prompt = "none"; } return Task.CompletedTask; } }; });
关键配置说明
SaveTokens: 将Azure AD返回的令牌保存到本地Cookie,便于后续请求复用SSO状态UseTokenLifetime: 本地会话的过期时间与Azure AD令牌保持一致,避免本地会话提前失效Prompt=none: 触发Azure AD的静默认证流程,若已有SSO会话则自动返回认证结果,无需用户交互- Cookie的
Domain和SameSite: 若应用跨域名部署,需配置共享Cookie域名并允许跨站点传递
2. 验证Azure AD应用注册配置
- 确保两个应用注册在同一个Azure AD租户下(你的配置中
TenantId一致,已满足) - 确认重定向URI(
CallbackPath)配置正确,本地开发可使用http://localhost:{端口}/signin-oidc,生产环境必须使用HTTPS地址 - 检查用户是否对两个应用都有访问权限(你已完成首次授权,此条件已满足)
3. 本地开发环境注意事项
- 若两个应用使用不同端口,浏览器会将其视为独立站点,本地Cookie无法共享,此时完全依赖Azure AD的全局SSO会话,确保浏览器未禁用第三方Cookie(
login.microsoftonline.com的Cookie属于第三方) - 测试时可先登录其中一个应用,再直接访问另一个应用的主页,若仍跳转认证页,可清除浏览器缓存后重试
内容的提问来源于stack exchange,提问作者Wade
相关产品推荐
相关产品推荐

