MVC应用部署到IIS后每次用户登录都会重置Session状态,该如何解决?
问题根本原因
你遇到的多用户身份串用问题,核心是误用全局静态实例存储用户级别身份数据,和Session配置、IIS缓存、测试浏览器无关:
ASP.NET应用中,static修饰的变量属于整个应用进程全局共享,所有访问站点的用户共用同一个MyUser.Default实例。本地开发时只有你单个用户测试,修改静态实例不会有冲突;部署到多用户访问的环境后,任意用户登录修改MyUser.Default的属性,所有其他用户读取到的都是被覆盖后的值,自然会出现User1能看到User2信息的问题。
修复步骤
- 移除所有直接对
MyUser.Default赋值、从MyUser.Default读取当前用户身份的代码 - 封装统一的当前用户读取逻辑,直接从当前请求独立的Session中拉取数据,示例代码如下:
public static class UserAuthHelper { // 每次读取都从当前用户的Session取,返回独立的MyUser实例 public static MyUser CurrentLoginUser { get { var currentSession = System.Web.HttpContext.Current.Session; // Session不存在用户信息时返回默认未登录实例 if (currentSession["usergroup"] == null || currentSession["userid"] == null) { return new MyUser() { usergroup = 0, userid = 0 }; } // 每次返回新的实例,避免不同用户数据互相干扰 return new MyUser() { usergroup = (int)currentSession["usergroup"], userid = (int)currentSession["userid"] }; } } }
- 后续所有业务代码需要获取当前登录用户信息时,统一调用
UserAuthHelper.CurrentLoginUser读取即可。 - 如果需要更稳定的身份验证能力,可直接使用ASP.NET自带的Forms身份验证、ASP.NET Identity体系,无需手动维护Session存储用户身份。
内容的提问来源于stack exchange,提问作者Ebikeneser
相关产品推荐
相关产品推荐

