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

C# 在.NET Framework和.NET Core之间共享身份验证cookie,c#,authentication,asp.net-core,cookies,C#,Authentication,Asp.net Core,Cookies,我想共享ASP.NET Framework应用程序提供的身份验证cookie,并在ASP.NET核心应用程序中使用它。要加密cookie,我使用的是数据保护,这是.NET Core中的默认设置,需要包Microsoft.AspNetCore.DataProtection.SystemWeb for.NET Framework 当.NET Core生成并保护cookie时,.NET Core应用程序的身份验证工作正常。当.NET Framework生成并保护cookie时,.NET核心应用程序不会

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

当.NET Core生成并保护cookie时,.NET Core应用程序的身份验证工作正常。当.NET Framework生成并保护cookie时,.NET核心应用程序不会使用它

根据适当保护,cookie应以“CfDJ8”开头,这是魔法“09 F0 C9 F0”头的base64表示形式,用于标识受数据保护系统保护的有效负载。由.NET内核生成的cookie以“CfDJ8”开头,但由.NET Framework生成的cookie以“09F0C9F0”开头。 看起来cookie的生成和保护是正确的,但是.NETCore使用base64对cookie进行编码,.NETFramework使用十六进制字符串


问题是,如何为ASP.NET核心数据保护加密的身份验证cookie设置公共cookie编码?

您应该在经典ASP.NET中使用数据保护API。要实现这一点,您可以参考以下步骤或直接检查

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

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

// Add cookie-based authentication to the request pipeline.
app.UseIdentity();
删除对UseIdentity的调用,将其替换为对UseCookieAuthentication的四个单独调用。(UseIdentity在封面下调用这四个方法。)在设置应用程序cookie的UseCookieAuthentication调用中,提供已初始化到密钥存储位置的DataProtectionProvider实例

// Add cookie-based authentication to the request pipeline.
// NOTE: Need to decompose this into its constituent components
// app.UseIdentity();

app.UseCookieAuthentication(null, IdentityOptions.ExternalCookieAuthenticationScheme);
app.UseCookieAuthentication(null, IdentityOptions.TwoFactorRememberMeCookieAuthenticationScheme);
app.UseCookieAuthentication(null, IdentityOptions.TwoFactorUserIdCookieAuthenticationScheme);
app.UseCookieAuthentication(null, IdentityOptions.ApplicationCookieAuthenticationScheme,
    dataProtectionProvider: new DataProtectionProvider(
        new DirectoryInfo(@"c:\shared-auth-ticket-keys\")));
警告:以这种方式使用时,DirectoryInfo应指向专门为身份验证Cookie留出的密钥存储位置。应用程序名称被忽略(故意忽略,因为您试图让多个应用程序共享有效负载)。应该考虑配置数据保护提供程序,以便在休息时对密钥进行加密,如下面的示例。

app.UseCookieAuthentication(null, IdentityOptions.ApplicationCookieAuthenticationScheme,
  dataProtectionProvider: new DataProtectionProvider(
      new DirectoryInfo(@"c:\shared-auth-ticket-keys\"),
      configure =>
      {
          configure.ProtectKeysWithCertificate("thumbprint");
      }));
cookie身份验证中间件将使用DataProtectionProvider的显式提供的实现,由于在其构造函数中使用显式目录,该实现与应用程序其他部分使用的数据保护系统隔离


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

我按照这里的指南在as.NET framework Webforms应用程序和更新的aspnetcore 5应用程序之间共享cookie

在我的例子中,webforms应用程序验证并发布cookie。我看到cookie已生成并正确设置,带有指示数据保护系统已生效的加密标题文本(请参见下面的屏幕截图)


webforms应用程序工作正常,但aspnetcore应用程序不使用此cookie!具有[Authorize]属性的任何操作都会返回到登录页面。在aspnet core端,还有什么需要做的吗?

我发现了问题所在。链接的指南是准确的,我在用于创建IDataProtector的目的字符串中输入了一个错误。我没有使用
protectionProvider.CreateProtector(“Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware”、“Identity.Application”、“v2”)
而是使用“v2”作为最后一个参数,大写V。一旦我修复了它,它就可以完美地工作。