【问题标题】:Multi domain session cookie多域会话 cookie
【发布时间】:2019-12-16 11:08:55
【问题描述】:

我有 2 个 Asp.Net Core 2.2 应用程序,我想在它们之间共享会话。我已经在 SQL 数据库中设置了会话,并且都连接正常。它们位于不同的子域上。我知道我可以将 Cookie.Domain 设置为启动文件,这将在基本层面解决问题,因此每个应用程序都会创建 cookie 以便可以访问它。例如

域 1.“www.website.com” 域 2.“dashboard.website.com” 目前这些站点无法访问彼此的会话 cookie。

如果我将域 cookie 设置为“.website.com”,那么两者都应该能够访问它。

问题是我们有多个域使用这个网站,所以它可能是:

www.domain1.com
dashboard.domain1.com

www.domain2.com
dashboard.domain2.com

www.domain3.com
dashboard.domain3.com

我需要能够将当前主机名注入启动 cookie 域,以便根据活动网站的域动态设置它。

这可能吗?

澄清一下,www.domain1.com 不需要能够访问 www.domain2.com。 只有万维网。和仪表板。每个域的变体需要能够相互连接。

提前致谢, 大卫

【问题讨论】:

  • 我相信这是用于授权 cookie,而不是会话 cookie?

标签: session asp.net-core


【解决方案1】:

要跨应用程序共享会话,您只需关注directions in the docs。它基本上归结为两件事:

  1. 您需要将数据保护密钥保存到所有应用程序都可以访问的公共存储中。一个 UNC 路径就可以了,或者你甚至可以使用 Azure Key Vault 之类的东西。

  2. 您需要设置一个通用的应用程序名称。默认情况下,数据保护值按应用程序隔离。设置一个自定义名称,然后在所有应用程序中使用该名称,它们都可以访问同一组数据。

就设置 cookie 域而言。按照惯例,没有好的方法可以做到这一点。实际的域名仅在请求管道的上下文中可用,而您在 Startup 之类的内容中不可用(没有请求)。即使您可以,它也不可靠。在您有反向代理的情况下,或者重要的是,在容器中托管时,域将是 localhost,因为实际域不会直接应用于应用程序。

总之,你最好的选择是使用配置。例如,您可以拥有特定于环境的 JSON 文件,例如 appsettings.Domain1.jsonappsettings.Domain2.json 等。在每个文件中,您可以添加如下内容:

{
    "CookieDomain": ".domain1.com"
}

然后,当您部署时,您将环境设置为适当的域,并且将使用该配置文件。在Startup 中,您只需:

services.ConfigureApplicationCookie(o => {
    o.Cookie.Domain = Configuration["CookieDomain"];
});

【讨论】:

  • 感谢您的回复。我让它在 localhost 上运行良好,并在两者之间设置了应用程序名称。我已经看到了数据保护密钥项目,但这至少在 localhost 上似乎并不重要——尽管可能还有其他东西在起作用。这个解决方案的问题是只有一个应用程序实例。每个应用程序没有不同的托管环境。
猜你喜欢
  • 2013-11-19
  • 1970-01-01
  • 2013-10-08
  • 2011-04-25
  • 1970-01-01
  • 2014-06-04
  • 2010-09-27
  • 2010-10-30
  • 2011-11-19
相关资源
最近更新 更多