.NET Framework 4.7.2站点如何共享同域.NET Core站点的身份验证凭证
注意:浏览器Cookie不绑定端口,只要主域名一致,不同端口的站点可以读取到同域下的Cookie,这是本方案可行的核心前提。你之前调试失败大概率是两边加密规则、Cookie配置参数没有完全对齐,按照以下步骤调整即可。
.NET Core 端配置
- 首先安装Nuget包
Microsoft.AspNetCore.DataProtection,如果用本地文件共享密钥,无需额外安装其他包 - 在Program.cs中配置完全一致的应用标识和共享密钥存储,示例代码:
// 配置统一的数据保护规则,两边配置必须完全对齐 builder.Services.AddDataProtection() .SetApplicationName("SharedSSO_App") // 名称必须和.NET Framework端完全一致 .PersistKeysToFileSystem(new DirectoryInfo(@"C:\SharedSSO_KeyStore\")) // 同服务器下给两个站点进程都开放读权限的目录 .DisableAutomaticKeyGeneration(); // 生产环境可按需调整,保证两边密钥一致即可 // 配置身份验证Cookie builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { options.Cookie.Name = ".SharedSSO.Auth"; options.Cookie.Domain = "your-main-domain.com"; // 填写两个站点共用的主域名,不要带端口 options.Cookie.SameSite = SameSiteMode.Lax; options.Cookie.HttpOnly = true; options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest; // 生产环境建议设为Always,全站走HTTPS options.LoginPath = "/Account/Login"; });
- 登录逻辑正常调用
HttpContext.SignInAsync生成Cookie即可。
.NET Framework 4.7.2 端配置
必须使用Owin中间件对接,首先安装对应的兼容Nuget包:Microsoft.Owin.Security.Cookies、Microsoft.Owin.Host.SystemWeb、Microsoft.AspNetCore.DataProtection.SystemWeb(核心兼容包,用于识别.NET Core生成的加密Cookie)
- 删除web.config中的
machineKey节点,避免原有ASP.NET加密逻辑和DataProtection规则冲突 - 在Owin Startup.cs的Configuration方法中添加以下配置:
public void Configuration(IAppBuilder app) { // 配置和.NET Core端完全一致的数据保护规则 app.UseDataProtection(new DataProtectionOptions { ApplicationDiscriminator = "SharedSSO_App" // 和Core端的SetApplicationName参数完全一致 }); // 配置Cookie认证,所有Cookie参数必须和Core端完全对齐 app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = CookieAuthenticationDefaults.AuthenticationType, CookieName = ".SharedSSO.Auth", CookieDomain = "your-main-domain.com", CookieHttpOnly = true, CookieSameSite = SameSiteMode.Lax, CookieSecure = CookieSecureOption.SameAsRequest, LoginPath = new PathString("/Account/Login.aspx"), Provider = new CookieAuthenticationProvider { // 可选:如果两边Claims结构有差异,可在此处做身份信息转换 OnValidateIdentity = context => { // 自定义身份校验逻辑,按需编写 return Task.CompletedTask; } } }); }
方案2:共享JWT令牌(备选,适合后续多站点扩展)
如果不想调整现有Cookie逻辑,可通过JWT实现身份共享:
- .NET Core端登录成功后,生成JWT令牌并存到主域名的Cookie中,JWT的签名密钥、过期时间、签发者、受众参数两边要提前约定完全一致
- .NET Framework端添加全局请求过滤器,每次请求读取JWT,校验签名合法后直接给当前请求赋值身份标识,完成身份验证
方案3:统一身份认证服务(长期架构升级方案)
如果后续还有其他站点需要接入,可搭建标准OIDC身份服务,两个站点都作为客户端对接,走标准授权码流程,天然支持跨站点单点登录,后续扩展灵活性更高。
内容的提问来源于stack exchange,提问作者Matthias Windisch
相关产品推荐
相关产品推荐

