.NET 7.0 Session被覆盖问题求助:新用户登录致旧用户信息替换
问题分析与解决方案
问题根源
你遇到的核心问题是SessionContext被注册为单例(Singleton)生命周期,导致整个应用程序中只有一个SessionContext实例。所有登录用户共享这个实例,当新用户登录时修改了实例的属性值,所有已登录用户看到的都会是新用户的信息。
解决步骤
1. 调整SessionContext的服务注册为作用域(Scoped)
在Program.cs(或Startup.cs)中,先注册用于访问当前请求上下文的IHttpContextAccessor,再将SessionContext注册为Scoped,确保每个用户的请求都会创建独立的实例:
// 注册HttpContextAccessor,用于获取当前请求的Session builder.Services.AddHttpContextAccessor(); // 将SessionContext注册为Scoped生命周期 builder.Services.AddScoped<SessionContext>();
2. 修改SessionContext,从Session动态读取数据
让SessionContext不再存储固定值,而是每次访问属性时从当前用户的Session中读取,确保数据始终与当前用户的Session一致:
public class SessionContext { private readonly IHttpContextAccessor _httpContextAccessor; // 通过构造函数注入IHttpContextAccessor public SessionContext(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; } // 动态从Session获取登录名 public string Login => _httpContextAccessor.HttpContext?.Session.GetString("session[user-login]") ?? string.Empty; // 动态从Session获取全名 public string Fullname => _httpContextAccessor.HttpContext?.Session.GetString("session[user-fullname]") ?? string.Empty; }
3. 简化登录逻辑,移除对SessionContext的直接赋值
现在SessionContext会自动从Session读取数据,登录时只需要维护Session即可,不需要再修改SessionContext的属性:
public LoginController() { // 不再需要注入SessionContext } public object Authenticate() { object userAuthentication = new Authentication().AuthenticateUser(username.ToUpper(), password); if (userAuthentication is Authentication data && userAuthentication is not int) { HttpContext.Session.SetString("session[status]", "authenticated"); HttpContext.Session.SetString("session[user-login]", data.user); HttpContext.Session.SetString("session[user-fullname]", data.name); // 移除对_userContext的赋值操作 return 200; } else { return 500; } }
4. Razor页面保持原有注入方式
页面注入逻辑不需要修改,Scoped的SessionContext会自动关联当前用户的请求,读取正确的Session数据:
@inject webAppPortalMedico_PFP.Models.Services.SessionContext session <h5> Hello @session.Fullname ! </h5>
原理说明
- Scoped生命周期:每个HTTP请求对应一个SessionContext实例,不同用户的请求不会共享同一个实例,从根源避免了数据覆盖。
- 动态读取Session:SessionContext的属性每次访问时都会从当前请求的Session中获取数据,确保始终显示当前登录用户的最新信息。
内容的提问来源于stack exchange,提问作者Paulo Paiva
相关产品推荐
相关产品推荐

