.NET Core 8中Web与API项目身份验证Cookie共享问题排查
问题排查与解决方案
核心问题分析
你的场景中笔记本能正常运行但开发机不行,结合代码和环境差异,主要存在以下关键问题:
1. InMemory数据库无法跨进程共享
InMemory是进程内数据库,Razor Pages和Web API是两个独立运行的进程,各自维护完全独立的TestDb实例。API中注册的用户数据不会同步到Razor Pages的数据库,即便Cookie配置正确,Razor Pages也找不到对应用户记录,导致登录状态不生效。
2. Web API项目缺少认证中间件
你的API代码仅调用了builder.Services.AddAuthorization(),但未在管道中启用认证中间件,导致Identity API生成的Cookie无法被正确处理,Razor Pages自然无法识别。
3. Cookie共享配置不完善
虽然你设置了Cookie名称和路径,但缺少跨端口共享所需的SameSite、Domain等关键配置,加上开发机可能存在的权限或HTTPS证书问题,进一步导致Cookie无法跨项目传递。
分步解决方案
步骤1:替换为共享数据库
放弃InMemory数据库,改用支持跨进程共享的数据库(如SQL Server LocalDB、SQLite),确保两个项目连接到同一数据库实例。
以SQLite为例,修改两个项目的AddDbContext配置:
// 两个项目使用相同的SQLite数据库文件路径 builder.Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlite(@"Data Source=C:\Visual Studio 2022\TestAppShared.db"));
步骤2:完善Web API的管道配置
在API的Program.cs中添加认证和授权中间件,确保管道顺序正确:
var app = builder.Build(); if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); // 新增以下两行,顺序不可调换 app.UseAuthentication(); app.UseAuthorization(); app.MapIdentityApi<IdentityUser>(); app.Run();
步骤3:优化Cookie共享配置
在两个项目的ConfigureApplicationCookie中补充以下配置,确保跨端口共享:
builder.Services.ConfigureApplicationCookie(options => { options.Cookie.Name = ".TestApp.SharedCookie"; options.Cookie.Path = "/"; // 显式设置Domain为localhost,支持跨端口共享 options.Cookie.Domain = "localhost"; // 开发环境设置SameSite为Lax(若用HTTPS可设为None,但需配合Secure=true) options.Cookie.SameSite = SameSiteMode.Lax; // 适配开发环境HTTPS自签名证书,自动跟随请求协议设置Secure属性 options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest; // 可选:延长Cookie有效期,方便测试 options.ExpireTimeSpan = TimeSpan.FromHours(2); });
步骤4:检查DataProtection密钥目录权限
确保开发机上C:\Visual Studio 2022\TestApiSecurity.Web目录的读写权限:
- 右键目录 → 属性 → 安全 → 确认当前Windows用户拥有读取和写入权限
- 若权限不足,添加当前用户并赋予对应权限,确保两个项目能共享加密密钥
验证步骤
- 同时启动Razor Pages和Web API项目
- 通过Swagger调用API的注册/登录接口,确认返回成功
- 刷新Razor Pages项目页面,检查登录状态是否正常显示
内容的提问来源于stack exchange,提问作者Trent W
相关产品推荐
相关产品推荐

