asp.net 跨域读取Cookies的问题。
使用Membership有三个站点,一个站点的域名是www.abc.com
两个子站的域名分别为bbs.abc.com和music.abc.com
三个站点的web.config里的都有样同的forms配置
<authentication mode="Forms">
<forms name=".ASPXAUTH" loginUrl="~/Account/Login.aspx" timeout="2880" domain=".abc.com" path="/" />
</authentication>
三个站点的程序完全相同的情况下(程序分别放在三台服务器上)
www.abc.com与bbs.abc.com能够共享登陆凭证,
但music.abc.com这个就不正常,在www.abc.com上登陆上后,bbs.abc.com上也显示成功登陆了,
但music.abc.com依然显示未登陆。
我使用HttpWatch跟踪了浏览器提交的Cookies,发现三个站点都已经正确提交了数据,
可是music.abc.com就无法读取由另外两个站点产生的cookies
我尝试在music这个子站登陆,结果发现登陆正常,
而另外两个站点上却被退出,同样,在另外两个站上登陆时,music上又被退出。
这是为什么呢?
在线期待牛人解答. --------------------编程问答-------------------- CookieContainer.GetCookies
CookieContainer cookieContainer = new CookieContainer();
req.CookieContainer = cookieContainer;
参考
--------------------编程问答-------------------- 将 Cookie 的有效范围限制到域
默认情况下,Cookie 与特定的域相关联。例如,如果您的站点是 www.contoso.com,那么当用户向该站点请求页面时,您编写的 Cookie 就被发送到服务器。(有特定路径值的 Cookie 除外,我在上一节刚刚解释过。) 如果您的站点有子域(例如 contoso.com、sales.contoso.com 和 support.contoso.com),就可以把 Cookie 同特定的子域相关联。为此,需要设置 Cookie 的 Domain 属性,如下所示:
Response.Cookies( "domain ").Value = DateTime.Now.ToString
Response.Cookies( "domain ").Expires = DateTime.Now.AddDays(1)
Response.Cookies( "domain ").Domain = "support.contoso.com "
如果按照这种方式设置域,则 Cookie 只能用于指定子域中的页面。
您也可以利用 Domain 属性来创建可在多个子域中共享的 Cookie。例如,对域进行如下设置:
Response.Cookies( "domain ").Value = DateTime.Now.ToString
Response.Cookies( "domain ").Expires = DateTime.Now.AddDays(1)
Response.Cookies( "domain ").Domain = "contoso.com "
这样,该 Cookie 就可用于主域、sales.contoso.com 和 support.contoso.com。 --------------------编程问答-------------------- 看这篇文章,参考 --------------------编程问答-------------------- 无法读取由另外两个站点产生的cookies
是所有cookies里面字段都无法读取吗?还是整个cookies都是空的?
我遇到过一些因为中文乱码导致的的一些字段无法读取,(如果客户端cookies文件名保存为中文的话可能会整个cookies无法读取)。
cookies的编码与服务器的配置(甚至和客户端配置都)有关系,即使3个网站程序一样,编码也可能不一样。
--------------------编程问答-------------------- 没有中文的,估计不是编码问题。
有三项值,
我跟踪了一下发现
浏览器一共提交了四个Cookies
分别是
.ASPXAUTH
__utma Sent
AJSTAT_ok_times
ASP.NET_SessionId
后三个都能正常读取,
只有第一个(.ASPXAUTH)未读取。
.ASPXAUTH的域对应的也没发现错,是.abc.com
真是不解…… --------------------编程问答-------------------- 生成cookie的时候,必须把 domain 写成 .abc.com ,这样各个子域都能共享~~ --------------------编程问答-------------------- 更让我不解的是,
__utma Sent
AJSTAT_ok_times
对应的域也是 .abc.com
为何这两个都能读取
而.ASPXAUTH就未能读取呢? --------------------编程问答-------------------- http://www.cnblogs.com/JerryBaxia/archive/2010/08/22/1805648.html --------------------编程问答--------------------
三个站设置都是.abc.com --------------------编程问答-------------------- Lz 不知道你是怎么配置跨域共享Session的, 我的做法是: 先设置相同的Cookies 域(就是你这样 .abc.com), 然后使用相同的服务器保存(SQL SERVER 或 ASP.NET STATE SERVICE), 最后各网站都强制修改并统一Session ID , 通过这种方式达到跨域共享Session。
我想问下,你这个 www.abc.com与bbs.abc.com能够共享登陆凭证, 是通过什么方式实现的? 难道是把用户密码等加密后保存到Cookies中吗? 还是用其他什么方式, 我也学习下。 --------------------编程问答--------------------
三个站点的代码完全同样。
www.abc.com与bbs.abc.com可以正常,
就这个music的特殊,这也是我很不解的地方,
如果是代码的问题应该三个都有问题才是…… --------------------编程问答-------------------- 而更让我不解的是,一共有四个cookies,
其中的三个都可以正常获取,就那登陆凭证的cookies无法获取。
我用HttpWatch跟踪了浏览器提交的cookies,
一共提交了四项,唯有名为.ASPXAUTH的读取不了,其它三项都能获取。
我用以下代码测试
if (Request.Cookies[".ASPXAUTH"] != null)
l_msg.Text += "<br>存在。";
else
l_msg.Text += "<br>不存在。";
得到的结果是“不存在”也就是说
Request.Cookies[".ASPXAUTH"] 为null
可以我跟踪浏览器提交的参数发现的确提交了.ASPXAUTH的。 --------------------编程问答-------------------- 那你这样好了, 你现在这三个网站应该还是在测试吧:
把 bbs.abc.com 和 music.abc.com 的项目互换测试下(就是项目 <--> 域名交换),我估计应该是 bbs.abc.com 不行了, 如果是这样,那还是你的现在的music配置有问题。
即然 www.abc.com与bbs.abc.com可以正常, 那肯定是 music 配置不对。 --------------------编程问答-------------------- 检查cookie name是否一致。
补充:.NET技术 , ASP.NET