当前位置:编程学习 > C#/ASP.NET >>

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 --------------------编程问答--------------------
引用 6 楼 hzsasheng 的回复:
生成cookie的时候,必须把 domain 写成 .abc.com ,这样各个子域都能共享~~


三个站设置都是.abc.com --------------------编程问答--------------------  Lz 不知道你是怎么配置跨域共享Session的, 我的做法是: 先设置相同的Cookies 域(就是你这样 .abc.com), 然后使用相同的服务器保存(SQL SERVER 或 ASP.NET STATE SERVICE), 最后各网站都强制修改并统一Session ID , 通过这种方式达到跨域共享Session。

我想问下,你这个 www.abc.com与bbs.abc.com能够共享登陆凭证, 是通过什么方式实现的? 难道是把用户密码等加密后保存到Cookies中吗? 还是用其他什么方式, 我也学习下。 --------------------编程问答--------------------
引用 10 楼 javaniejian 的回复:
 Lz 不知道你是怎么配置跨域共享Session的, 我的做法是: 先设置相同的Cookies 域(就是你这样 .abc.com), 然后使用相同的服务器保存(SQL SERVER 或 ASP.NET STATE SERVICE), 最后各网站都强制修改并统一Session ID , 通过这种方式达到跨域共享Session。

我想问下,你这个 www.abc.com与bbs.abc.com……

三个站点的代码完全同样。
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
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,