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

如何在ASP.NET WebForms与.NET 6.0 Core之间共享会话状态

实现ASP.NET WebForms与.NET 6 Core双向会话共享的方案

一、统一会话存储介质

两边必须使用同一个外部会话存储(默认各自会话存储独立),推荐Redis(性能优先)或SQL Server(兼容性优先),以下以Redis为例说明:

1. 配置ASP.NET WebForms项目

  • 安装Microsoft.Web.RedisSessionStateProvider NuGet包
  • 在web.config中配置Redis会话提供器:
    <system.web>
      <sessionState mode="Custom" customProvider="RedisSessionProvider">
        <providers>
          <add name="RedisSessionProvider" 
               type="Microsoft.Web.Redis.RedisSessionStateProvider"
               host="你的Redis服务器地址"
               port="6379"
               accessKey="你的Redis访问密钥(如有)"
               ssl="true/false"
               throwOnError="true"
               retryTimeoutInMilliseconds="5000"
               databaseId="0" />
        </providers>
      </sessionState>
    </system.web>
    

2. 配置.NET 6 Core项目

  • 安装Microsoft.Extensions.Caching.StackExchangeRedis和Microsoft.AspNetCore.Session NuGet包
  • 在Program.cs中配置会话和Redis缓存:
    var builder = WebApplication.CreateBuilder(args);
    
    // 添加会话服务,确保Cookie名称与WebForms一致(默认WebForms为ASP.NET_SessionId)
    builder.Services.AddSession(options =>
    {
        options.IdleTimeout = TimeSpan.FromMinutes(30); // 与WebForms超时保持一致
        options.Cookie.HttpOnly = true;
        options.Cookie.IsEssential = true;
        options.Cookie.Name = "ASP.NET_SessionId";
    });
    
    // 配置Redis作为会话存储,实例名与WebForms保持一致(默认RedisSessionProvider用"Session:")
    builder.Services.AddStackExchangeRedisCache(options =>
    {
        options.Configuration = "你的Redis服务器地址:6379,password=你的访问密钥(如有),ssl=true/false";
        options.InstanceName = "Session:";
    });
    
    var app = builder.Build();
    
    // 启用会话中间件(顺序需在UseRouting之后,UseEndpoints之前)
    app.UseSession();
    
    app.UseRouting();
    // ...其他中间件及端点配置
    

二、确保会话加密与ID一致性

两边必须使用相同的机器密钥加密/解密会话数据,否则即使共享存储也无法解析对方的会话内容:

1. WebForms项目配置机器密钥

在web.config的system.web节点下添加:

<machineKey 
  validationKey="生成的安全验证密钥" 
  decryptionKey="生成的安全解密密钥" 
  validation="SHA1" 
  decryption="AES" />

可通过.NET工具或安全的在线生成器生成密钥,注意保密

2. .NET 6 Core项目配置相同机器密钥

在Program.cs中配置数据保护,对齐WebForms的加密规则:

builder.Services.AddDataProtection()
    .PersistKeysToFileSystem(new DirectoryInfo(@"C:\SharedKeys")) // 可选:持久化密钥到共享目录,避免重启丢失
    .UseCryptographicAlgorithms(new AuthenticatedEncryptionOptions()
    {
        EncryptionAlgorithm = EncryptionAlgorithm.AES_256_CBC,
        ValidationAlgorithm = ValidationAlgorithm.HMACSHA1 // 与WebForms的validation配置一致
    })
    .SetApplicationName("你的统一应用名称"); // 两边需完全一致

// 补充Cookie配置,确保跨项目共享
builder.Services.Configure<CookiePolicyOptions>(options =>
{
    options.MinimumSameSitePolicy = SameSiteMode.Unspecified;
    options.OnAppendCookie = ctx => ctx.CookieOptions.SameSite = SameSiteMode.Unspecified;
});

三、双向会话访问测试

  • WebForms中设置会话值:
    Session["UserName"] = "JohnDoe";
    
  • .NET 6 Core中读取该值:
    var userName = HttpContext.Session.GetString("UserName");
    
  • 反向操作同理,注意会话键名大小写:WebForms不区分大小写,Core默认区分,建议统一键名格式

四、关键注意事项

  • 两个项目需共用同一域名/子域名,或把Cookie的Domain属性设为父域名,确保Cookie跨项目传递
  • 两边会话超时时间必须配置一致,避免一方会话过期后另一方仍尝试访问
  • 若使用SQL Server作为存储,WebForms用System.Web.SessionState.SqlSessionStateStore,Core配置AddSqlServerCache,核心逻辑仍是共享存储+相同机器密钥

内容的提问来源于stack exchange,提问作者Icemanind

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 02:30:50