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

ASP Forms与ASP.NET MVC间如何通过Context.User.Identity共享会话?

跨ASP.NET Forms与MVC项目的会话共享解决方案

嘿,咱们先把核心逻辑理清楚:Context.User.Identity本身并不是用来直接跨项目“获取会话”的工具——它只是用来承载当前已认证用户的身份信息(比如用户名、角色、唯一ID这类标识)。不过别担心,我们完全可以基于它的身份标识,结合ASP.NET的跨应用会话共享机制,实现你要的效果。下面一步步拆解:

先搞懂前提条件

要让两个项目能共享会话和身份信息,必须满足这两个基础配置:

  • 两个项目处于同一个域名/子域名下(如果跨顶级域名,还需要额外配置Cookie的domain属性);
  • 两个项目使用相同的机器密钥(Machine Key),并且会话状态存储在共享的外部介质(比如SQL Server、Redis,绝对不能用默认的InProc进程内存储,因为进程内数据没法跨应用访问)。

具体实现步骤

1. 统一配置机器密钥

机器密钥负责加密/解密认证票和会话Cookie,两个项目必须用完全相同的密钥,才能互相识别对方生成的Cookie。

  • 对于ASP.NET Forms和.NET Framework的MVC项目,在各自的web.config里添加相同的machineKey节点:
<system.web>
  <machineKey 
    validationKey="你生成的随机验证密钥" 
    decryptionKey="你生成的随机解密密钥" 
    validation="SHA1" 
    decryption="AES" />
</system.web>

(密钥可以用ASP.NET自带的生成工具或在线工具生成,确保两个项目的密钥完全一致)

  • 如果你的MVC项目是.NET Core/.NET 5+,则需要在Program.cs中配置数据保护,指向共享的密钥存储位置:
builder.Services.AddDataProtection()
    .PersistKeysToFileSystem(new DirectoryInfo(@"\\shared-server\keys"))
    .SetApplicationName("YourSharedAppName");

2. 配置共享会话存储

把两个项目的会话数据都存在同一个外部存储中,这样双方都能读取到:

  • 以SQL Server为例,在两个项目中配置会话状态:
    • Framework项目web.config:
    <system.web>
      <sessionState 
        mode="SQLServer" 
        sqlConnectionString="Server=your-db-server;Database=SessionDB;Trusted_Connection=True;" />
    </system.web>
    
    • Core项目appsettings.json:
    "Session": {
      "ConnectionString": "Server=your-db-server;Database=SessionDB;Trusted_Connection=True;"
    }
    
    然后在Program.cs中启用SQL Server会话:
    builder.Services.AddSession(options => {
        options.IdleTimeout = TimeSpan.FromMinutes(30);
        options.Cookie.HttpOnly = true;
        options.Cookie.IsEssential = true;
        options.Cookie.Domain = ".yourdomain.com"; // 子域名共享时设置父域名
    });
    builder.Services.AddDistributedSqlServerCache(options => {
        options.ConnectionString = builder.Configuration.GetConnectionString("Session");
        options.SchemaName = "dbo";
        options.TableName = "Sessions";
    });
    

3. 利用Identity标识关联会话数据

当用户在Forms项目登录后,Context.User.Identity.Name(或你自定义的唯一用户Claim)是跨项目识别用户的唯一标识:

  • 在Forms项目中,把需要共享的会话数据以用户标识为键,存入共享会话:
// Forms项目中,用户登录成功后保存会话数据
Session[User.Identity.Name + "_UserPreferences"] = userPreferences;
  • 在MVC项目中,先确保用户身份被正确认证(因为我们配置了相同的机器密钥和认证方式,MVC项目会自动读取Forms项目的认证Cookie,从而填充Context.User.Identity),然后用相同的键读取会话数据:
public ActionResult Dashboard()
{
    if (User.Identity.IsAuthenticated)
    {
        // 读取Forms项目存入的共享会话数据
        var userPreferences = Session[User.Identity.Name + "_UserPreferences"];
        // 后续业务逻辑处理
    }
    return View();
}

关键注意事项

  • 确保两个项目的认证方式完全一致:如果Forms项目用的是传统Forms认证,MVC项目也要配置Forms认证;如果用的是ASP.NET Identity,要确保两个项目连接同一个用户数据库,并且Identity配置相同。
  • 跨域名场景下,必须设置Cookie的domain属性为父域名(比如.example.com),这样子域名下的两个项目都能读取到认证Cookie和会话Cookie。
  • 绝对不要使用InProc会话模式:这种模式下会话数据存在应用进程内存中,两个项目进程独立,完全没法共享。

内容的提问来源于stack exchange,提问作者Emerson Francisco Cartagena Ca

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:40:01