2011-06-14 129 views
3

我在www.domain.com上设置了一个站点,该站点可以对用户进行身份验证并将其凭据保存在Cookie中。跨不同子域(但不是全部)进行身份验证

有时用户访问在不同子域上的不同服务器上设置的处理程序。 handlers.domain.com

我不能使用通配符子域的cookies(曲奇不应该适用于其他子域)

我访问控制解决了到现在为止是用于handlers.domain.com每个URL有一个GUID具体到用户。其他站点上的处理程序将假定该GUID所有者的身份。这当然不是一个很好的安全措施。

我考虑的替代方案:以handlers.domain.com所有链接竟然会被链接到www.domain.com一个重定向脚本,将重定向到脚踩handlers.domain.com URL加密的时间,那么这将肯定知道它是作为直接访问从www.domain.com认证重定向。 此解决方案在GET场景下工作正常,但会遇到预期POST数据的处理程序失败(上传大文件)

有谁知道或可以想到更好的解决方案或对我的解决方案有任何洞察?

(在这种情况下,我使用ASP.NET但解决的办法很可能是平台无关的,所以我会用不同的网络平台标签这个)

谢谢!

回答

1

由于您不想使用cookie建立会话(请求组),您需要找到其他方法。由于cookie的信息在HTTP请求中可读,所以如果您针对该特定请求将该信息作为POST请求的一部分传递,我不会看到问题。

如果您更喜欢GET请求,我还会在重定向之前在用户服务器端会话内添加一个标志,以便为重定向的目的地提供脚本以验证请求在服务器上的有效性-侧。

+0

我确实建立了一个会话,但只在第一个子域上。也许,现在这是一个纯ASP.NET问题,我可以通过POST请求发布sessionId,并在其他域中“加入”会话(我使用中央数据库会话管理),但我不确定这可以是但在ASP.NET – Variant 2011-06-14 13:05:04

+0

中完成您可能必须重写默认会话模块才能完成此操作,但这可能是可行的。 – jdc 2011-06-14 13:10:44

+0

会议只是在我的回答中用作广义术语。例如,您可以将该标志放入数据库,然后从另一台服务器上的数据库中查询该标志,而不管使用何种类型的“会话模块”。只传递数据服务器端来验证请求是否有效。如果您使用密码术,您将共享密钥服务器端。但是使用密码学,你需要知道你在做什么以及如果秘密密钥被篡改或丢失了怎么办。通过“会话”(两台服务器之间的共享存储),每个请求都会有一个“秘密”。 – hakre 2011-06-14 13:19:27

0

你说你“不能使用通配符子域Cookie(Cookie不应该可用于其他子域)”。这是否意味着您无法用金钱购买或者您不希望用户访问所有子域名?如果是第二个,那么您仍然可以使用子域Cookie,方法是将该用户的ID加入一个加密值,并在不同子域上检查它与访问权限。这样可以将所有服务器都保存在更安全的服务器上,而不是在URL级别。潜在的黑客通过它的唯一方法是猜测另一个用户的ID并找出您的密钥以正确加密它。

+0

我为每个子域名每个cookie支付10美元的费用,所以它变得相当昂贵...(开玩笑) – Variant 2011-06-14 12:58:26

+0

我不想使用通配域cookie的原因是因为其他子域服务器的分段,开发和演示版本该网站,我不希望饼干混合。 – Variant 2011-06-14 12:59:22