关于二级域名Cookie的问题及解决方法

     今天博客园全面采用二级域名后,发现即使用户已经登录,但在访问二级域名Blog页面时都显示没有登录(表现为发表评论时要求输入验证码, 收藏功能无法正常使用),再次登录后,进入其他二级域名还是需要登录。在代码中,我是通过Request.IsAuthenticated来判断当前请求是否被验证的,以前全部采用www.cnblogs.com域名时很正常,看来是域名不同引起的。对于Form验证,验证是通过cookie进行的,在执行Request.IsAuthenticated时,会请求客户端相应的Cookie, Cookie名是在web.config中指定的,比如博客园web.config中的设置:

<authentication mode="Forms"> 
   
<forms name=".DottextCookie" loginUrl="login.aspx" protection="All" timeout="480" path="/" /> 
</authentication> 

也就是说在执行Request.IsAuthenticated时,会执行类似这样的代码,HttpCookie cookie = Request.Cookies[".DottextCookie"];我们知道Cookie是与域名关联的,HttpCookie就有个Domain属性。博客园所遇到的问题就是二级域名不能访问主域名的cookie,登录时,博客园的程序通过FormsAuthentication.SetAuthCookie设置Cookie, 而登录代码是在www.cnblogs.com域名下执行的,cookie的域名被默认设置为www.cnblogs.com, 而我们在二级域名下就无法访问这个cookie,如何解决这个问题呢?cookie的domain是否可以设置成对所有二级域名有效?在Google中苦苦寻觅,终于找到了一篇文章(Tips On Using SubDomain), 原来可以将cookie关联的域设置为".domain.ext", 博客园的设置就是.cnblogs.com。 这样,我在FormsAuthentication.SetAuthCookie之后,加上这样的代码就解决问题了:

HttpCookie cookie = Request.Cookies[".DottextCookie"];
                
if(cookie!=null)
                
{
                    cookie.Domain 
= ".cnblogs.com";
                    
Response.Cookies.Add(cookie);
                }

注:
    1、如果你现在还会遇到访问二级域名要重新登录的情况,请删除你计算机中相应的cookie文件,路径在C:\Documents and Settings\用户名\Cookies与C:\Documents and Settings\用户名\Local Settings\Temporary Internet Files中,文件格式为:用户名@www.cnblogs.com, 然后重新登录。
    2、如果你发现其他与二级域名相关的问题,请及时与我联系。
    3、如果你在访问博客园时,出现“Runtime Error”错误,那是因为刚刚更新了dll文件,你再过1、2分钟重新打开IE访问就行了。
    4、现在已经全面启用二级域名。

posted @ 2005-07-04 22:58 dudu 阅读(9837) 评论(36)  编辑 收藏 网摘 所属分类: ASP.NET 1.1

  回复  引用  查看    
#1楼 2005-07-04 23:28 | hbifts      
好像有问题...
重新登陆后,发表评论的时候得手动写姓名,主页和验证码.
不如以前方便:(
是不是没修改啊?
  回复  引用  查看    
#2楼 2005-07-05 00:34 | hbifts      
咦,现在好了..
不过,主页里填的是以前的地址.不是新的二级域名:)
  回复  引用  查看    
#3楼 [楼主]2005-07-05 00:44 | dudu      
@hbifts
登录的问题应该好了, 你再试试。
发表评论时主页地址已经改过来了, 谢谢你发现这个问题。
  回复  引用  查看    
#4楼 2005-07-05 01:12 | 天生钝刀      
注销有点问题。
还有就是想问FormsAuthentication.SetAuthCookie后,客户端才有.DottextCookie。
要再次提交到相同的域名才可能使用
HttpCookie cookie = Request.Cookies[".DottextCookie"];
if(cookie!=null)
{
cookie.Domain = ".cnblogs.com";
Response.Cookies.Add(cookie);
}
改变CookieDomain。
举例:我从登陆www.cnblogs.com,登陆以后转到lw.cnblogs.com就无法得到Cookie了。当然我只是做假设
  回复  引用    
#5楼 2005-07-05 08:29 | wwonion [未注册用户]
请教一下2级域名实现原理可以吗?
  回复  引用  查看    
#6楼 2005-07-05 09:13 | - -      
同问,呵呵

好象博客园现在左边菜单打开的速度非常慢
  回复  引用  查看    
#7楼 [楼主]2005-07-05 10:04 | dudu      
@天生钝刀
注销的问题已经解决。
登录是在www.cnblogs.com域名下进行的。

@wwonion
在DNS服务器中设置泛域名解析。

@- -
那是Google广告引起的。
  回复  引用  查看    
#8楼 2005-07-05 10:44 | 心仪      
dudu,不得已在这里提问。
为什么我不能登陆我的blog了?也没有什么报错,填了用户名、密码和验证码以后没有什么反应,重新又跳转至登陆页面,只是这次验证码图片不能正常显示,出现一个“×”。
为什么呀?我试了很多次,internet选项都恢复了N次,还是不行。
  回复  引用  查看    
#9楼 [楼主]2005-07-05 10:54 | dudu      
@心仪
现在你可以登录了。
非常抱歉!是二级域名带来的问题。
  回复  引用    
#10楼 2005-07-05 11:06 | NoFile [未注册用户]
我觉得如果使用 http://cnblogs.com/login.aspx进行登陆,就不存在在cookie中设置domain的问题了,因为默认域就是 .cnblogs.com,这样一次登陆,所有的二级域名都可以用了,www不也就是一个二级域名嘛
  回复  引用  查看    
#11楼 [楼主]2005-07-05 11:23 | dudu      
@NoFile
好方法!非常感谢!
  回复  引用  查看    
#12楼 2005-07-05 11:26 | 心仪      
dudu,还是不可以,症状相同。
  回复  引用  查看    
#13楼 [楼主]2005-07-05 11:39 | dudu      
@心仪
用IE的刷新按钮刷新试试。我这里测试了, 可以正常显示。
  回复  引用  查看    
#14楼 2005-07-05 12:00 | zendyhu      
今天一早看了dudu还深陷subDomain和Forms验证登录的泥潭中,深感同情,因为我曾经也处理多个网站共享用户已登录信息(通过cookie的subdomain实现),故今早趁空闲时间研究一番! 请dudu参照下面的code处理,应该能解决问题(我已经在我本机测试通过,请把zendyhu.com替换为cnblogs.com):

在任何登录处代码:
//the following code block equal to "FormsAuthentication.RedirectFromLoginPage + change cookie domain "
FormsAuthentication.SetAuthCookie(txtName.Text,false);
HttpCookie lcookie = Context.Response.Cookies[FormsAuthentication.FormsCookieName];
lcookie.Domain = ".zendyhu.com";
Response.Redirect(FormsAuthentication.GetRedirectUrl(txtName.Text,false));


在任何注销处的代码:
//set the cookie to expired
FormsAuthentication.SignOut();
//get the expired cookie
HttpCookie lcookie2 = Context.Response.Cookies[FormsAuthentication.FormsCookieName];
//set the cookie Domain
lcookie2.Domain = ".zendyhu.com";
Response.Redirect("user.aspx");
  回复  引用  查看    
#15楼 2005-07-05 12:25 | 心仪      
真的不行,我试过很多种清空缓存的方法,但结果还是不行。
虽然用刷新按钮,可以看到每次验证码都会改变,但那是假相。你点击“新随笔”、“联系”就会看到验证码图片位置处显示“×”。
  回复  引用  查看    
#16楼 2005-07-05 13:16 | Zendy      
@dudu:
FormsAuthentication.SetAuthCookie后添加下属代码
HttpCookie cookie = Request.Cookies[".DottextCookie"];
if(cookie!=null)
{
cookie.Domain = ".cnblogs.com";
Response.Cookies.Add(cookie);
} ”是否是笔误。因为在FormsAuthentication.SetAuthCookie之后,cookie只是被加入了Response的cookies队列中而已,我想正确的代码应该如下:
FormsAuthentication.SetAuthCookie(txtName.Text,false);
HttpCookie lcookie = Context.Response.Cookies[FormsAuthentication.FormsCookieName];
lcookie.Domain = ".cnblogs.com";

详细解释可查看“在Forms验证模式下,实现多个站点(SubDomain相同)共享同一用户登录状态 http://caomao.cnblogs.com/archive/2005/07/05/186606.html”
  回复  引用  查看    
#17楼 [楼主]2005-07-05 14:09 | dudu      
@心仪
你换台电脑或者用Firefox试试, 可能是你的浏览器有问题。
  回复  引用  查看    
#18楼 [楼主]2005-07-05 14:18 | dudu      
@Zendy
谢谢你的帮助。
我的代码也是可行的, 我测试过, 而且在博客园用了一段时间。
NoFile所说的方法是最简单有效的方法, 现在已经采用他所说的方法, 这样就不需要对cookie进行专门处理, 直接用FormsAuthentication.SetAuthCookie就行了。

  回复  引用  查看    
#19楼 [楼主]2005-07-05 14:24 | dudu      
@心仪
原因找到了, 是因为你的Blog帐户中含有"_"符号, 去掉它就好了, 现在已经将你的Blog改为 http://xinyi.cnblogs.com/
  回复  引用    
#20楼 2005-07-05 15:29 | xinyi [未注册用户]
谢谢dudu。
  回复  引用  查看    
#21楼 [楼主]2005-07-05 18:37 | dudu      
@xinyi
以前的地址仍然有效: http://www.cnblogs.com/xin_yi
  回复  引用  查看    
#22楼 [楼主]2005-07-05 21:51 | dudu      
@Zendy
非常感谢!
事实证明你的方法才是真正有效的。在http://cnblogs.com下登录的方法在IE中有效, 在Firefox中无效。在Firefox查看cookie, http://cnblogs.com下登录生成的cookie的域名是cnblogs.com,而不是.cnblogs.com
  回复  引用    
#23楼 2005-07-13 10:59 | 小杰 [未注册用户]
FormsAuthentication.SetAuthCookie(txtName.Text,false);
HttpCookie lcookie = Context.Response.Cookies[FormsAuthentication.FormsCookieName];
lcookie.Domain = ".cnblogs.com";


这么做的话,我如果要想在本地测试这个程序,登陆的时候怎么办啊?
lcookie.Domain = "localhost";
这样是不行的
lcookie.Domain = "";
也不行

  回复  引用  查看    
#24楼 [楼主]2005-07-13 11:25 | dudu      
本地测试需要通过域名访问, 可以在host文件中添加域名解析, 并在IIS中配置相应的主机头。
  回复  引用    
#25楼 2005-07-13 11:44 | 小杰 [未注册用户]
这个我当然知道,但是这个是指我的机器上的host文件

如果别人通过局域网访问我的机器,除非他也修改它的host文件,否则也是不行

但是最初的时候不指定domain的时候,别人可以通过局域网的机器名就可以访问并且登陆,我是想说,怎么能够仅仅是设置一下lcookie.Domain,就能够让本地能够通过http://localhost登陆
  回复  引用  查看    
#26楼 [楼主]2005-07-13 11:56 | dudu      
在代码中判断一下, 如果是通过localhost域名登录, 就把Cookie的确良Domain设置为localhost。
  回复  引用    
#27楼 2005-08-23 16:22 | maisie [未注册用户]
@dudu

"本地测试需要通过域名访问, 可以在host文件中添加域名解析, 并在IIS中配置相应的主机头。
"

这一段话 不明白呀,能否具体点??
  回复  引用    
#28楼 2005-09-09 09:03 | 汽水 [未注册用户]
请问心仪如果用 asp怎么写?
  回复  引用  查看    
#29楼 2005-09-09 13:15 | 小迪      
我登陆不上
我的Blog:
http://www.cnblogs.com/xiaodi

密码取回也至今未收到

我的邮箱:
zwg1118@citiz.net
zwj821118@msn.com
xiaodi@zhaoh.com
上面的随便选个发给我吧


  回复  引用  查看    
#30楼 2006-05-18 13:14 | 仰天一笑      
注册用户的时候直接生成二级域名的.net源代码如何实现?谢谢
  回复  引用    
#31楼 2006-10-26 18:01 | kuakesjm [未注册用户]
请问,如果不同的二级域名对应的应用程序所属程序集不一样,一个是.net1.1 另一个是.net2.0 它们之间为什么无法实现Cookie共享呢,?
  回复  引用    
#32楼 2008-01-31 18:01 | wwmj [未注册用户]
请帮我看看
这是website1的配置文件
<authentication mode="Forms">
<forms name="EOMemberShipUser" loginUrl="index.aspx" protection="All"></forms>
</authentication>

按登录 按扭 执行
protected void Button1_Click(object sender, EventArgs e)
{
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, "wmj", DateTime.Now, DateTime.Now.AddMinutes(60), true, "User");
string cookieStr = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, cookieStr);
cookie.Expires = ticket.Expiration;
//cookie.Path = FormsAuthentication.FormsCookiePath;
cookie.Domain = ".hnczjsxy.cn";
Response.Cookies.Add(cookie);
Response.Redirect("Default.aspx", false);
}

下面是website2的配置文件
<authentication mode="Forms">

<forms name="EOMemberShipUser" domain=".hnczjsxy.cn" loginUrl="index.aspx" protection="All"></forms>
</authentication>

website2的首页的LOAD方法
protected void Page_Load(object sender, EventArgs e)
{
if (Request.IsAuthenticated)
{

Response.Redirect("~/Default.aspx", false);

}
else
{
Response.Redirect("~/ErrorPage.aspx", false);
}



}
说明 website1和website2的域名 分别是www.hnczjsxy.cn/和bbs.hnczjsxy.cn/
且不在同一台虚礼主机上,
请帮我看看

  回复  引用    
#33楼 2008-01-31 18:02 | wwmj [未注册用户]
这是我的email =wmj2212@126.com
如果可能,请给DEMO给我,拜托了
  回复  引用  查看    
#34楼 2008-08-19 15:26 | xiaohc      
不同域名之间如何实现呢?请dudu指教

比如abc.com和abc.net之间共用一套会员体系,如何认证及写COOKIE?

像搜狐那样,SOHU,SOGOU,CHINAREN共用
  回复  引用  查看    
#35楼 2008-11-13 14:15 | 张明海      
HttpCookie myCookie = new HttpCookie(CookieName);

myCookie.Domain = System.Configuration.ConfigurationManager.ConnectionStrings["domain"].ConnectionString;
........................... 一开始就设置起




标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接:

历史上的今天:
2004-07-04 [公告]新建开源项目区