在两个命名域之间共享会话cookie

3
我有一个.net Web应用程序,包括以下域名: www.domain.com sub.domain.com files.domain.com
当用户登录domain.com或sub.domain.com时,我希望他们共享会话状态(即同时登录两个域)。通过将会话cookie上的域设置为“.domain.com”可以实现。然而,我的问题是,由于安全原因(来自托管在该域上的用户制作的文件的xss攻击),域“files.domain.com”不应该有会话状态。
在ASP.NET中,是否可以使用相同的asp.net会话ID来处理这两个域,但不包括第三个域?
谢谢!
5个回答

3
以下是几个可行的选项:
#1 - 通过客户端脚本将您的登录请求发布到两个应用程序。这将使您能够同时为两个有效域设置cookie。通过为您想要对用户进行身份验证的特定域创建cookie,可以避免您担心的XSS问题。
#2 - 将您的“不安全”站点移动到不同的域中。例如:www.domain-files.com。通过此选项,您可以使用共享cookie来管理身份验证。

是的,将文件域移动当然是正确的方法,但我不确定是否会被接受。我可以在两个域上发布登录请求,谢谢Joe! - El Che

2
不要混淆会话cookie和表单身份验证cookie。ASP.NET会话不能在应用程序之间共享。就表单身份验证cookie而言,它只是一个简单的cookie,cookie的工作方式是通过设置domain属性来实现的。
我能想到的一种方法是在两个应用程序的web.config中定义特殊的machineKeys。这样,在www.domain.com上进行身份验证的用户将被发出一个使用www.domain.com的机器密钥加密的cookie,因为只有sub.domain.com拥有相同的密钥,所以才能解密该cookie。该cookie仍然会发送到files.domain.com,但它无法解密它,用户也无法在那里进行身份验证。


1
在我看来,问题是为什么人们可以上传可能包含XSS攻击的文件?如果他们能够这样做,他们可能会找到引起其他问题的方法。
最有可能的候选者是在您的登录页面上具有一个JavaScript函数,该函数将凭据发送到另一个服务器。因此,当某人登录到一个域时,JavaScript函数同时将其登录到另一个域。
我同意joe.liedtke的观点,他说将files.domain.com移动到另一个域中,从而完全避免这个问题。

0
尝试这个: 在不同的子域上共享asp.net身份验证 如下所述,只有具有匹配机器密钥的应用程序才能相互进行身份验证。因此,假设files.domain.com被赋予不同的机器密钥,则无法解密会话cookie,并且没有其他域的权限。

谢谢,不幸的是这还不是我要找的。浏览器仍然会发送cookie,从而使存储在该域上的javascript文件拦截cookie - 为其他域上的会话劫持提供入口点。 - El Che

0
也许,直接使用Response.Cookies将Guid值存储在cookie中,然后根据该值查询数据库以获取共享身份验证信息,可以完成您的任务。

直到我意识到在 XSS 攻击中仍然可以使用单独的 cookie,我才认为这是正确的。 - DeveloperChris
在 Guid 的末尾添加一个令牌,指示先前的请求 ID。例如,在第 43 次请求时,使用值为“sessionid={guidvalue}43”的 cookie。然后验证请求编号。 - smartcaveman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接