跨域cookie访问(或会话)

时间:2009-06-02 12:36:58

标签: asp.net cookies cross-domain subdomain

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

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

提前致谢:)

7 个答案:

答案 0 :(得分:18)

Inproc会话无法保持有效,但您可以对Web应用程序进行编码,以允许跨多个子域的Cookie。您需要将域设置为:

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

Remember the period.

答案 1 :(得分: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
  4. 这是一个简化的方案。域two.com需要能够信任one.com,不仅如此,还需要知道请求是真实的,而不仅仅是由用户制作,因此您需要使用公钥/私钥来缓解此

答案 2 :(得分:2)

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

  1. 将Cookie的范围限制在服务器上的文件夹中,允许您将Cookie限制为网站上的应用程序。
  2. 将范围设置为域,允许您指定域中的哪些子域可以访问Cookie。
  3. 您可以了解更多here

答案 3 :(得分:1)

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

我认为这非常类似于在服务器场中跨服务器维护状态的问题,解决方案可能是确保您的会话存储在两个站点之间保持一致(如果它们不是来自同一'网站'的服务器IIS)。您可以将会话存储移动到SQL Server(HOW TO: Configure SQL Server to Store ASP.NET Session State)中,这可能是出于此目的,因为每个站点在查找与它们一起呈现的cookie相关的会话数据时都会查询同一个存储。

我希望能让你走上正轨。

答案 4 :(得分: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中,也会知道您的会话是否有效。

答案 5 :(得分:0)

您可以为特定域设置Cookie。

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

稍微搜索一下asp:

试试这个:

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

或阅读this

答案 6 :(得分:0)