如何阻止登录第二个端口转发的.NET Core MVC实例时第一个被登出?
问题原因
这是同一浏览器中两个实例的认证Cookie互相覆盖导致的:
- .NET Core MVC默认使用名为
.AspNetCore.Identity.Application的Cookie存储登录状态 - 通过同一个WANIP(不同端口)访问两个实例时,浏览器会判定为同一域名下的请求,将同一个Cookie发送给两个实例。登录实例二时,新的认证Cookie会覆盖实例一的Cookie,直接导致实例一登录状态失效。
- 局域网内访问用的是两个实例的不同本地IP,Cookie绑定到各自IP不会冲突;不同浏览器的Cookie是隔离存储的,因此也不会互相影响。
解决方案
1. 给每个实例配置独立的Cookie名称(最直接有效)
修改每个实例的认证配置,指定唯一的Cookie名称:
- 实例一的
Program.cs(或Startup.cs):
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { options.Cookie.Name = "Instance1_Auth"; // 自定义唯一名称 });
- 实例二的
Program.cs(或Startup.cs):
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { options.Cookie.Name = "Instance2_Auth"; // 与实例一不同的名称 });
2. 可选:配置Cookie的Path属性(需配合路由调整)
如果不想修改Cookie名称,可以给每个实例的Cookie指定不同的Path,让浏览器区分:
- 实例一配置:
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { options.Cookie.Path = "/instance1"; });
- 实例二配置:
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { options.Cookie.Path = "/instance2"; });
注意:这种方式需要确保两个实例的路由前缀分别对应/instance1和/instance2,否则Cookie无法正确匹配。
内容的提问来源于stack exchange,提问作者David_Jones
相关产品推荐
相关产品推荐

