虽然我意识到这通常与跨站点脚本攻击有关,但我想知道的是,如何在属于单个域的多个子域中保持有效会话(例如:用户只登录一次,并且能够使用相同的会话访问subdomain1.domain.com和subdomain2.domain.com)。我想我首先需要了解它是如何工作的,但到目前为止,我还没有找到任何相关的东西。
但话说回来,也许我没有问正确的问题。
提前致谢:)
答案 0 :(得分:18)
Inproc会话无法保持有效,但您可以对Web应用程序进行编码,以允许跨多个子域的Cookie。您需要将域设置为:
Response.Cookies("CookieName").Domain = ".mydomain.com"
答案 1 :(得分:6)
有很多方法可以跨域共享会话数据或Cookie数据。最简单的方法是通过共享数据存储在服务器端共享它。但你不会问这个问题是否那么容易。
另一种方法同样简单。域one.com
包含一些会话数据name=aleem
和id=123
,并希望将其传递给two.com
。它将遵循以下步骤:
two.com/api/?name=aleem&id=123
two.com
通过查询参数获取数据时,它会创建一个包含数据的cookie。此Cookie将存储在two.com
域名下。two.com
然后会重定向回REFERER
,在这种情况下恰好是one.com
这是一个简化的方案。域two.com
需要能够信任one.com
,不仅如此,还需要知道请求是真实的,而不仅仅是由用户制作,因此您需要使用公钥/私钥来缓解此
答案 2 :(得分:2)
默认情况下,站点的所有Cookie都存储在客户端上,并且所有Cookie都会在向该站点发出任何请求时发送到服务器。换句话说,站点中的每个页面都会获取该站点的所有cookie。但是,您可以通过两种方式设置Cookie的范围:
您可以了解更多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)