首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在.NET框架和.Net内核之间共享认证cookie

在.NET框架和.Net内核之间共享认证cookie
EN

Stack Overflow用户
提问于 2020-02-03 06:51:54
回答 2查看 2.6K关注 0票数 3

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

当cookie核心为.NET核心应用程序生成和保护cookie身份验证时。当cookie框架生成并保护cookie时,.NET核心应用程序不会使用它。

根据https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/compatibility/replacing-machinekey?view=aspnetcore-3.1的说法,正确保护的cookie应该以"CfDJ8“开头,这是神奇的"09 F0 C9 F0”头的base64表示,它标识了受数据保护系统保护的有效负载。.NET核心生成的cookie以"CfDJ8“开头,而.NET框架生成的cookie以"09F0C9F0”开头。看起来cookie是正确生成和保护的,但是.NET核心使用base64来编码cookie,而.NET框架使用十六进制字符串。

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

EN

回答 2

Stack Overflow用户

发布于 2021-02-05 07:33:24

我遵循这里的指南,在.NET框架Webforms应用程序和较新的aspnetcore5应用程序之间共享cookie。

https://docs.microsoft.com/en-us/aspnet/core/security/cookie-sharing?view=aspnetcore-5.0

在我的例子中,webforms应用程序进行身份验证并发出cookie。我看到cookie已生成并正确设置了加密头文本,表明数据保护系统正在生效(请参见下面的屏幕截图)。

webforms应用程序运行良好,但是aspnetcore应用程序不使用此cookie!任何具有Authorize属性的操作都会返回到登录页面。在aspnet核心端还需要做些什么才能让它工作吗?

票数 1
EN

Stack Overflow用户

发布于 2020-02-03 11:51:26

您应该在经典的asp.net中使用数据保护接口。要实现这一点,您可以参考以下步骤或直接查看此Document

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

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

代码语言:javascript
复制
// Add cookie-based authentication to the request pipeline.
app.UseIdentity();

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

代码语言:javascript
复制
// 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应指向专门为身份验证cookies预留的密钥存储位置。应用程序名称被忽略(有意如此,因为您试图让多个应用程序共享有效负载)。您应该考虑配置DataProtectionProvider,以便密钥在静态时加密,如下例所示。

代码语言:javascript
复制
app.UseCookieAuthentication(null, IdentityOptions.ApplicationCookieAuthenticationScheme,
  dataProtectionProvider: new DataProtectionProvider(
      new DirectoryInfo(@"c:\shared-auth-ticket-keys\"),
      configure =>
      {
          configure.ProtectKeysWithCertificate("thumbprint");
      }));

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

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60031362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档