gaoxiang
今天博客园全面采用二级域名后,发现即使用户已经登录,但在访问二级域名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、现在已经全面启用二级域名。

评论

# re: 关于二级域名Cookie的问题及解决方法 2005-07-04 23:28 hbifts

好像有问题...
重新登陆后,发表评论的时候得手动写姓名,主页和验证码.
不如以前方便:(
是不是没修改啊?  回复   

# re: 关于二级域名Cookie的问题及解决方法 2005-07-05 00:34 hbifts

咦,现在好了..
不过,主页里填的是以前的地址.不是新的二级域名:)  回复   

# re: 关于二级域名Cookie的问题及解决方法 2005-07-05 00:44 dudu

@hbifts
登录的问题应该好了, 你再试试。
发表评论时主页地址已经改过来了, 谢谢你发现这个问题。  回复   

# re: 关于二级域名Cookie的问题及解决方法 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了。当然我只是做假设  回复   

# re: 关于二级域名Cookie的问题及解决方法 2005-07-05 08:29 wwonion

请教一下2级域名实现原理可以吗?  回复   

# re: 关于二级域名Cookie的问题及解决方法 2005-07-05 09:13 - -

同问,呵呵

好象博客园现在左边菜单打开的速度非常慢   回复   

# re: 关于二级域名Cookie的问题及解决方法 2005-07-05 10:04 dudu

@天生钝刀
注销的问题已经解决。
登录是在www.cnblogs.com域名下进行的。

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

@- -
那是Google广告引起的。   回复   

# re: 关于二级域名Cookie的问题及解决方法 2005-07-05 10:44 心仪

dudu,不得已在这里提问。
为什么我不能登陆我的blog了?也没有什么报错,填了用户名、密码和验证码以后没有什么反应,重新又跳转至登陆页面,只是这次验证码图片不能正常显示,出现一个“×”。
为什么呀?我试了很多次,internet选项都恢复了N次,还是不行。  回复   

# re: 关于二级域名Cookie的问题及解决方法 2005-07-05 10:54 dudu

@心仪
现在你可以登录了。
非常抱歉!是二级域名带来的问题。  回复   

# re: 关于二级域名Cookie的问题及解决方法 2005-07-05 11:06 NoFile

我觉得如果使用 http://cnblogs.com/login.aspx进行登陆,就不存在在cookie中设置domain的问题了,因为默认域就是 .cnblogs.com,这样一次登陆,所有的二级域名都可以用了,www不也就是一个二级域名嘛  回复   

# re: 关于二级域名Cookie的问题及解决方法 2005-07-05 11:23 dudu

@NoFile
好方法!非常感谢!  回复   

# re: 关于二级域名Cookie的问题及解决方法 2005-07-05 11:26 心仪

dudu,还是不可以,症状相同。  回复   

# re: 关于二级域名Cookie的问题及解决方法 2005-07-05 11:39 dudu

@心仪
用IE的刷新按钮刷新试试。我这里测试了, 可以正常显示。  回复   

# re: 关于二级域名Cookie的问题及解决方法 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");  回复   

# re: 关于二级域名Cookie的问题及解决方法 2005-07-05 12:25 心仪

真的不行,我试过很多种清空缓存的方法,但结果还是不行。
虽然用刷新按钮,可以看到每次验证码都会改变,但那是假相。你点击“新随笔”、“联系”就会看到验证码图片位置处显示“×”。  回复   

# re: 关于二级域名Cookie的问题及解决方法 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”  回复   

# re: 关于二级域名Cookie的问题及解决方法 2005-07-05 14:09 dudu

@心仪
你换台电脑或者用Firefox试试, 可能是你的浏览器有问题。  回复   

# re: 关于二级域名Cookie的问题及解决方法 2005-07-05 14:18 dudu

@Zendy
谢谢你的帮助。
我的代码也是可行的, 我测试过, 而且在博客园用了一段时间。
NoFile所说的方法是最简单有效的方法, 现在已经采用他所说的方法, 这样就不需要对cookie进行专门处理, 直接用FormsAuthentication.SetAuthCookie就行了。
  回复   

# re: 关于二级域名Cookie的问题及解决方法 2005-07-05 14:24 dudu

@心仪
原因找到了, 是因为你的Blog帐户中含有"_"符号, 去掉它就好了, 现在已经将你的Blog改为 http://xinyi.cnblogs.com/。  回复   

# re: 关于二级域名Cookie的问题及解决方法 2005-07-05 15:29 xinyi

谢谢dudu。  回复   

# re: 关于二级域名Cookie的问题及解决方法 2005-07-05 18:37 dudu

@xinyi
以前的地址仍然有效: http://www.cnblogs.com/xin_yi  回复   

# re: 关于二级域名Cookie的问题及解决方法 2005-07-05 21:51 dudu

@Zendy
非常感谢!
事实证明你的方法才是真正有效的。在http://cnblogs.com下登录的方法在IE中有效, 在Firefox中无效。在Firefox查看cookie, http://cnblogs.com下登录生成的cookie的域名是cnblogs.com,而不是.cnblogs.com。  回复   

# re: 关于二级域名Cookie的问题及解决方法 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 = "";
也不行
  回复   

# re: 关于二级域名Cookie的问题及解决方法 2005-07-13 11:25 dudu

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

# re: 关于二级域名Cookie的问题及解决方法 2005-07-13 11:44 小杰

这个我当然知道,但是这个是指我的机器上的host文件

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

但是最初的时候不指定domain的时候,别人可以通过局域网的机器名就可以访问并且登陆,我是想说,怎么能够仅仅是设置一下lcookie.Domain,就能够让本地能够通过http://localhost登陆?  回复   

# re: 关于二级域名Cookie的问题及解决方法 2005-07-13 11:56 dudu

在代码中判断一下, 如果是通过localhost域名登录, 就把Cookie的确良Domain设置为localhost。  回复   

# re: 关于二级域名Cookie的问题及解决方法 2005-08-23 16:22 maisie

@dudu

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

这一段话 不明白呀,能否具体点??  回复   

# re: 关于二级域名Cookie的问题及解决方法 2005-09-09 09:03 汽水

请问心仪如果用 asp怎么写?  回复   

# re: 关于二级域名Cookie的问题及解决方法 2005-09-09 13:15 小迪

我登陆不上
我的Blog:
http://www.cnblogs.com/xiaodi

密码取回也至今未收到

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

分类:

技术点:

相关文章: