11

虽然我意识到这通常与跨站点脚本攻击有关,但我想知道的是会话如何在属于单个域的多个子域中保持有效(例如:用户只登录一次,并且能够访问两者subdomain1.domain.com 和 subdomain2.domain.com 具有相同的会话)。我想我首先需要了解它是如何工作的,但到目前为止我还没有找到任何相关的东西。

但话又说回来,也许我没有问正确的问题。

提前致谢 :)

4

7 回答 7

18

Inproc 会话不能保持有效,但是您可以编写 Web 应用程序以允许跨多个子域的 cookie。您需要将域设置为:

Response.Cookies("CookieName").Domain = ".mydomain.com"

记住时期。

于 2009-06-02T12:44:20.980 回答
6

有很多方法可以跨域共享会话数据或 cookie 数据。最简单的是通过共享数据存储在服务器端共享它。但如果这很容易,你就不会问这个问题了。

另一种方法同样简单。该域one.com包含一些会话数据name=aleemid=123并希望将其传递给two.com. 它将遵循以下步骤:

  1. 拨打电话two.com/api/?name=aleem&id=123
  2. two.com通过查询参数获取数据时,它会使用数据创建一个 cookie。此 cookie 将存储在two.com域下。
  3. two.com然后将重定向回REFERER在这种情况下恰好是one.com

这是一个简化的场景。域two.com需要能够信任one.com,不仅如此,它还需要知道请求是真实的,而不仅仅是由用户制作的,因此您需要使用公钥/私钥来缓解这种情况。

于 2009-06-02T12:57:19.940 回答
2

默认情况下,一个站点的所有 cookie 都存储在客户端上,并且所有 cookie 都与对该站点的任何请求一起发送到服务器。换句话说,站点中的每个页面都会获取该站点的所有 cookie。但是,您可以通过两种方式设置 cookie 的范围:

  1. 将 cookie 的范围限制在服务器上的文件夹中,这允许您将 cookie 限制在站点上的应用程序中。
  2. 将范围设置为域,它允许您指定域中的哪些子域可以访问 cookie。

你可以在这里了解更多。

于 2009-06-02T12:45:56.420 回答
1

关于为域设置 cookie 以允许子域接收该 cookie 的注释为您提供了这一方面,但缺少的是会话的一致性。

我认为这非常类似于在场中的服务器之间维护状态的问题,解决方案可能是确保您的会话存储在两个站点之间保持一致(如果它们不是来自 IIS 中同一个“网站”的服务器)。您可以将会话存储移动到 SQL Server(如何:配置 SQL Server 以存储 ASP.NET 会话状态),这可能会达到目的,因为每个站点在查找与他们的 cookie 相关的会话数据时都会查询相同的存储。已提交。

我希望这能让你走上正轨。

于 2009-06-02T12:52:05.770 回答
1

如果您有能力设置一个公共子域,您可以这样做:

在您的子域 html 文件中,在顶部包含一个 javascript 文件,如下所示:

<script src="http: //common.domain.com/check.asp"></script>

在 check.asp 中,查找您的 logged_in cookie,如果不存在,则显示一个页面,例如http://common.domain.com/login.asp使用类似

<%
if (cookie_not_found){
%>
location.href = "http: //common.domain.com/login.asp";
<%
}
%>

用户提交用户名密码后,将其提交回相同的 login.asp 并设置会话 cookie(将在 common.domain.com 域中设置),然后重定向到http://subdomain1.domain.com.

现在会发生的是,将对嵌入的“common.domain.com/check.asp”进行调用,common.domain.com 的 cookie 将与请求一起由浏览器发送。因此,即使您在 subdomain1.domain.com 中,您也会知道您的会话是否有效。

于 2009-06-02T13:41:41.753 回答
0

这是一个有效的解决方案:

http://anantgarg.com/2010/02/18/cross-domain-cookies-in-safari/

于 2010-02-18T12:30:55.540 回答
0

您可以为特定域设置 cookie。

在 php 中,setCookie()方法包含一个参数,可以在其中指定顶级域,因此 cookie 对所有子域都有效。根据您的标签,我看到您正在使用 asp.net。可能这也存在于asp......

经过一番搜索asp:

尝试这个:

Response.Cookies("CookieName").Domain = ".mydomain.com"

或阅读

于 2009-06-02T12:41:04.670 回答