如何在ASP.NET WebForms与.NET 6.0 Core之间共享会话状态
实现ASP.NET WebForms与.NET 6 Core双向会话共享的方案
一、统一会话存储介质
两边必须使用同一个外部会话存储(默认各自会话存储独立),推荐Redis(性能优先)或SQL Server(兼容性优先),以下以Redis为例说明:
1. 配置ASP.NET WebForms项目
- 安装
Microsoft.Web.RedisSessionStateProviderNuGet包 - 在
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.SessionNuGet包 - 在
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
相关产品推荐
相关产品推荐

