在Forms验证模式下,实现多个站点(SubDomain相同)共享同一用户登录状态
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                在Forms验证模式下,实现多个站点(SubDomain相同)共享同一用户登录状态
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                
                            
                            
                            原文:http://caomao.cnblogs.com/archive/2005/07/05/186606.html
今天一早看了dudu關于二級域名Cookie的問題及解決方法,認為dudu的原理解釋不是十分明確,不能確定dudu的代碼
FormsAuthentication.SetAuthCookie后添加下屬代碼
HttpCookie cookie = Request.Cookies[".DottextCookie"];
if(cookie!=null)
{
cookie.Domain = ".cnblogs.com";
Response.Cookies.Add(cookie);
} ”是否是筆誤。因為在FormsAuthentication.SetAuthCookie之后,cookie只是被加入了Response的cookies隊列中而已,我想正確的代碼應該如下:
??//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?=?".cnblogs.com";//
???Response.Redirect(FormsAuthentication.GetRedirectUrl(txtName.Text,false));
共享用戶登錄狀態的原理解釋如下:
Asp.net中的Forms驗證方式,在服務端通過用戶驗證的代碼一般如下:
FormsAuthentication.RedirectFromLoginPage("UserName", false);//該代碼寫一個加密的Cookie.該Cookie存儲UserName等加密信息。但是在Asp.net中,該Cookie的Domain值是為空,表示以游覽器默認的頁面請求路徑的Domain值作為cookie的domain存儲。如果瀏覽器以www.cnblogs.com/login.aspx 登錄,那么該瀏覽器存儲cookie的時,該cookie的domain為www.cnblogs.com。這樣如果瀏覽器請求頁面 http://caomao.cnblogs.com/admin/EditPosts.aspx,此時,瀏覽器不會把剛才存儲的cookie值作為Request的Cookie向服務器發送。因為caomao.cnblogs.com和www.cnblogs.com是完全不同的主域名。
cookie的domain屬性就是為了讓瀏覽器根據頁面請求路徑的domain值,獲取匹配的cookie,并把這些cookie發送給服務器。而匹配的方式有兩種:
1、主Domain完全相同. 比如 頁面請求路徑的Domain一直是www.cnblogs.com。而domain為“caomao.cnblogs.com”的cookie是不匹配的
2、SubDomain相同, 比如,如果在caomao.cnblogs.com/上寫的cookie指定了該cookie的domain為"cnblogs.com",那么在瀏覽器請求www.cnblogs.com時,該cookie被匹配,即該cookie也會被發送給www.cnblogs.com服務器端。
為了在www.cnblogs.com的也能讀取在caomao.cnblogs.com上存儲的用戶已經登錄的cookie信息,必須讓該cookie的domain設置為"cnblogs.com"。但是正如上面所述,Asp.net的FormsAuthentication.RedirectFromLoginPage("UserName", false);記錄用戶登錄的cookie的domain為空。所以我們不能用FormsAuthentication.RedirectFromLoginPage("UserName", false);方式,而必須以下面的代碼代替:
??//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?=?".cnblogs.com";//
???Response.Redirect(FormsAuthentication.GetRedirectUrl(txtName.Text,false));經過該代碼處理的Forms驗證登錄的User,再去訪問www.cnblogs.com時,就能共享該已登錄信息。同樣的,如果在www.cnblogs.com登錄時也用上述代碼,在caomao.cnblogs.com時,也能共享該已登錄信息。
關于用戶的注銷處理也需要做類似的改動,具體代碼如下:
//set?the??cookie?to?expired
????????????FormsAuthentication.SignOut();????
????????????//get?the?expired?cookie
????????????HttpCookie??lcookie2?=?Context.Response.Cookies[FormsAuthentication.FormsCookieName];
????????????//set?the?cookie?Domain?
????????????lcookie2.Domain?=?".cnblogs.com";
說到這里,不知道大家是否已經清楚?由于表達能力所限,敬請諒解。附上具體實例代碼,供參考:/Files/caomao/SecondDomain.rar。
在本機仿真兩個同SubDomain的環境,可以在本機的操作系統安裝路徑下的host文件中添加兩個host:我添加了:(第一作為主域,第二個作為二級域)
127.0.0.1?http://www.zendyhu.com/?
127.0.0.1?Second.zendyhu.com
 
                        
                        
                        今天一早看了dudu關于二級域名Cookie的問題及解決方法,認為dudu的原理解釋不是十分明確,不能確定dudu的代碼
FormsAuthentication.SetAuthCookie后添加下屬代碼
HttpCookie cookie = Request.Cookies[".DottextCookie"];
if(cookie!=null)
{
cookie.Domain = ".cnblogs.com";
Response.Cookies.Add(cookie);
} ”是否是筆誤。因為在FormsAuthentication.SetAuthCookie之后,cookie只是被加入了Response的cookies隊列中而已,我想正確的代碼應該如下:
??//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?=?".cnblogs.com";//
???Response.Redirect(FormsAuthentication.GetRedirectUrl(txtName.Text,false));
共享用戶登錄狀態的原理解釋如下:
Asp.net中的Forms驗證方式,在服務端通過用戶驗證的代碼一般如下:
FormsAuthentication.RedirectFromLoginPage("UserName", false);//該代碼寫一個加密的Cookie.該Cookie存儲UserName等加密信息。但是在Asp.net中,該Cookie的Domain值是為空,表示以游覽器默認的頁面請求路徑的Domain值作為cookie的domain存儲。如果瀏覽器以www.cnblogs.com/login.aspx 登錄,那么該瀏覽器存儲cookie的時,該cookie的domain為www.cnblogs.com。這樣如果瀏覽器請求頁面 http://caomao.cnblogs.com/admin/EditPosts.aspx,此時,瀏覽器不會把剛才存儲的cookie值作為Request的Cookie向服務器發送。因為caomao.cnblogs.com和www.cnblogs.com是完全不同的主域名。
cookie的domain屬性就是為了讓瀏覽器根據頁面請求路徑的domain值,獲取匹配的cookie,并把這些cookie發送給服務器。而匹配的方式有兩種:
1、主Domain完全相同. 比如 頁面請求路徑的Domain一直是www.cnblogs.com。而domain為“caomao.cnblogs.com”的cookie是不匹配的
2、SubDomain相同, 比如,如果在caomao.cnblogs.com/上寫的cookie指定了該cookie的domain為"cnblogs.com",那么在瀏覽器請求www.cnblogs.com時,該cookie被匹配,即該cookie也會被發送給www.cnblogs.com服務器端。
為了在www.cnblogs.com的也能讀取在caomao.cnblogs.com上存儲的用戶已經登錄的cookie信息,必須讓該cookie的domain設置為"cnblogs.com"。但是正如上面所述,Asp.net的FormsAuthentication.RedirectFromLoginPage("UserName", false);記錄用戶登錄的cookie的domain為空。所以我們不能用FormsAuthentication.RedirectFromLoginPage("UserName", false);方式,而必須以下面的代碼代替:
??//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?=?".cnblogs.com";//
???Response.Redirect(FormsAuthentication.GetRedirectUrl(txtName.Text,false));經過該代碼處理的Forms驗證登錄的User,再去訪問www.cnblogs.com時,就能共享該已登錄信息。同樣的,如果在www.cnblogs.com登錄時也用上述代碼,在caomao.cnblogs.com時,也能共享該已登錄信息。
關于用戶的注銷處理也需要做類似的改動,具體代碼如下:
//set?the??cookie?to?expired
????????????FormsAuthentication.SignOut();????
????????????//get?the?expired?cookie
????????????HttpCookie??lcookie2?=?Context.Response.Cookies[FormsAuthentication.FormsCookieName];
????????????//set?the?cookie?Domain?
????????????lcookie2.Domain?=?".cnblogs.com";
說到這里,不知道大家是否已經清楚?由于表達能力所限,敬請諒解。附上具體實例代碼,供參考:/Files/caomao/SecondDomain.rar。
在本機仿真兩個同SubDomain的環境,可以在本機的操作系統安裝路徑下的host文件中添加兩個host:我添加了:(第一作為主域,第二個作為二級域)
127.0.0.1?http://www.zendyhu.com/?
127.0.0.1?Second.zendyhu.com
轉載于:https://www.cnblogs.com/qiantuwuliang/archive/2009/03/09/1406616.html
總結
以上是生活随笔為你收集整理的在Forms验证模式下,实现多个站点(SubDomain相同)共享同一用户登录状态的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: HSRP-热备份路由协议
- 下一篇: Windows命令行下的进程管理
