You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 01:13:14