在.NET Framework和.Net Core之间共享身份验证cookie

Mar*_*rek 8 c# authentication cookies asp.net-core

我想共享 ASP.NET Framework 应用程序提供的身份验证 cookie 并在 ASP.NET Core 应用程序中使用它。为了加密 cookie,我使用数据保护,这是 .NET Core 中的默认设置,并且需要 .NET Framework 包 Microsoft.AspNetCore.DataProtection.SystemWeb。

当 .NET Core 生成并保护 cookie 时,身份验证适用于 .NET Core 应用程序。当 .NET Framework 生成并保护 cookie 时,.NET Core 应用程序不会使用它。

根据https://learn.microsoft.com/en-us/aspnet/core/security/data-protection/compatibility/replacing-machinekey?view=aspnetcore-3.1,正确保护的cookie应以“CfDJ8”开头,这是神奇的“09 F0 C9 F0”标头的 Base64 表示形式,用于标识受数据保护系统保护的有效负载。.NET Core 生成的 cookie 以“CfDJ8”开头,但 .NET Framework 生成的 cookie 以“09F0C9F0”开头。看起来 cookie 已正确生成并受到保护,但 .NET Core 使用 base64 来编码 cookie,而 .NET Framework 使用十六进制字符串。

问题是,如何为 ASP.NET Core Data Protection 加密的身份验证 cookie 设置通用 cookie 编码?

小智 -1

您应该在经典 ASP.NET 中使用数据保护 API。为此,您可以参考以下步骤或直接查看此\n文档

\n\n

要在两个不同的 ASP.NET 5 应用程序之间共享身份验证 cookie,请按如下方式配置应共享 cookie 的每个应用程序。

\n\n

将该包安装Microsoft.AspNet.Authentication.Cookies.Shareable到每个 ASP.NET 5 应用程序中。\n在 Startup.cs 中,找到对 UseIdentity 的调用,它通常如下所示。

\n\n
// Add cookie-based authentication to the request pipeline.\napp.UseIdentity();\n
Run Code Online (Sandbox Code Playgroud)\n\n

删除对 UseIdentity 的调用,并将其替换为对 UseCookieAuthentication 的四个单独的调用。(UseIdentity 在幕后调用这四个方法。)在对设置应用程序 cookie 的 UseCookieAuthentication 的调用中,提供已初始化到密钥存储位置的 DataProtectionProvider 实例。

\n\n
// Add cookie-based authentication to the request pipeline.\n// NOTE: Need to decompose this into its constituent components\n// app.UseIdentity();\n\napp.UseCookieAuthentication(null, IdentityOptions.ExternalCookieAuthenticationScheme);\napp.UseCookieAuthentication(null, IdentityOptions.TwoFactorRememberMeCookieAuthenticationScheme);\napp.UseCookieAuthentication(null, IdentityOptions.TwoFactorUserIdCookieAuthenticationScheme);\napp.UseCookieAuthentication(null, IdentityOptions.ApplicationCookieAuthenticationScheme,\n    dataProtectionProvider: new DataProtectionProvider(\n        new DirectoryInfo(@"c:\\shared-auth-ticket-keys\\")));\n
Run Code Online (Sandbox Code Playgroud)\n\n

注意:以这种方式使用时,DirectoryInfo 应指向专门为身份验证 cookie 预留的密钥存储位置。应用程序名称被忽略(故意如此,因为您\xe2\x80\x99正在尝试让多个应用程序共享有效负载)。您应该考虑配置 DataProtectionProvider,以便对密钥进行静态加密,如下例所示。

\n\n
app.UseCookieAuthentication(null, IdentityOptions.ApplicationCookieAuthenticationScheme,\n  dataProtectionProvider: new DataProtectionProvider(\n      new DirectoryInfo(@"c:\\shared-auth-ticket-keys\\"),\n      configure =>\n      {\n          configure.ProtectKeysWithCertificate("thumbprint");\n      }));\n
Run Code Online (Sandbox Code Playgroud)\n\n

cookie 身份验证中间件将使用显式提供的 DataProtectionProvider 实现,由于在其构造函数中采用显式目录,因此与应用程序其他部分使用的数据保护系统隔离。

\n\n

Asp.net 将使用 DI 注入的数据保护来加密 cookie,在这种情况下,您需要在经典的 asp.net 应用程序中启用 owin auth。

\n