同服务器部署的两个Azure AD认证MVC应用登录后互踢登出问题
问题根因
两个应用部署在同一域名/IP下时,默认使用完全相同的认证Cookie名称.AspNet.Cookies和会话Cookie名称ASP.NET_SessionId,后登录的应用生成的Cookie会直接覆盖前一个应用的同名Cookie,导致前一个应用的本地认证信息丢失,因此actionContext.RequestContext.Principal.Identity.IsAuthenticated会返回False。
解决方案
按以下步骤分别修改两个应用的配置即可解决:
- 配置独立的认证Cookie名称
在ConfigureAuth方法的CookieAuthenticationOptions配置段中,为每个应用设置唯一的Cookie名称,若应用部署在同一域名的不同子路径下,还可新增CookiePath参数强化隔离:public void ConfigureAuth(IAppBuilder app) { app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); app.UseCookieAuthentication(new CookieAuthenticationOptions { // 两个应用分别设置不同的Cookie名称,比如AppA用.AppA后缀,AppB用.AppB后缀 CookieName = ".AspNet.Cookies.AppA", // 若用子路径隔离可增加此行,对应各自的应用部署路径 // CookiePath = "/AppA", AuthenticationType = CookieAuthenticationDefaults.AuthenticationType, SlidingExpiration = true, Provider = new CookieAuthenticationProvider { OnResponseSignIn = context => { context.Properties.AllowRefresh = true; context.Properties.ExpiresUtc = DateTimeOffset.UtcNow.AddDays(1); }, OnValidateIdentity = MyCookieValidateIdentity }, ExpireTimeSpan = TimeSpan.FromDays(2) }); // 原有OpenIdConnect配置保持不变 ... } - 配置独立的会话Cookie名称
修改应用根目录下的web.config文件,在<system.web>节点下新增sessionState配置,两个应用分别设置不同的会话Cookie名:<system.web> <!-- AppA的配置,AppB修改为ASP.NET_SessionId.AppB即可 --> <sessionState cookieName="ASP.NET_SessionId.AppA" /> <!-- 原有其他配置保持不变 --> ... </system.web>
验证效果
修改配置后重新部署两个应用,登录后查看浏览器的Cookie存储,可以看到两个应用的认证Cookie、会话Cookie均独立存在,不会互相覆盖,跨应用切换时登录状态可正常保留。
内容的提问来源于stack exchange,提问作者Hunterr
相关产品推荐
相关产品推荐

