IT168技術文檔】
這兩天在研究 Forms 進行使用者驗證, 它本身沒有什麼上msdn上查一下就知道怎麼個搞法了! 不過我在測試的時候發現也會產生
了一些疑問!
1. 什麼我在web.config 的 authentication節點下的 Forms 中設定了Domain,當我FormsAuthentication.SetAuthCookie(loginName, false);
之後, 然後 HttpContext.Current.User.Identity.Name 的時候總是返回給我 "", 這個讓我很鬱悶!
2. 即然在 config 指定了不行,那我就在代碼中指定使用者cookie 的 Domain, 但是問題又出現了.
a). 還是無法取到 Identity.Name 的值.
b). 使用者成功退出.
如果我們對於 Cookie 的 Domain 不處理的語,也就沒有我上面所說的問題.
常規做法:
1, 配置 web.config 節點
<!--
通過 <authentication> 節可以配置 ASP.NET 使用的
安全身分識別驗證模式,
以標識傳入的使用者。
-->
<authentication mode="Forms">
<forms name=".Bk5173"
protection="All"
timeout="30"
path="/"
requireSSL="false"
cookieless="UseDeviceProfile"
enableCrossAppRedirects="false">
</forms>
</authentication>
2. 驗證使用者的使用者名稱和密碼合法之後:
//設定使用者的 cookie 的值
FormsAuthentication.SetAuthCookie(loginName, false);
3 . 上一步就是把使用者的名稱寫 cookie, 之後的話就可以 擷取使用者的名稱.
string idenName = HttpContext.Current.User.Identity.Name;
4. 我們就可以根據 idenName 來對使用者判斷了. 如果 idenName = "" 的話那麼就跳轉到 登陸頁面讓使用者登陸,否則的話就顯示出使用者的名稱到 UI 當中.
5. 退出時,用下面的方法就可以了.
FormsAuthentication.SignOut();
到這裡,不知有沒有注意,都沒有對於Cookie Domain 進行設定, 這也正是我將要做的.修改以上的方法.
1).修改方法:
//設定使用者的 cookie 的值
FormsAuthentication.SetAuthCookie(loginName, false);
為以下方法:
//設定使用者的 cookie 的值
FormsAuthentication.SetAuthCookie(loginName, false);
//擷取使用者的 cookie
HttpCookie cookie = FormsAuthentication.GetAuthCookie(loginName, false);
//給使用者的 cookie 的值加上 cookie 的域 和 到期日期
//更新 使用者 cookie
FormsAuthenticationTicket oldTicket = FormsAuthentication.Decrypt(cookie.Value);
FormsAuthenticationTicket newTicket = new FormsAuthenticationTicket(1,
oldTicket.Name,
oldTicket.IssueDate,
DateTime.Now.AddMinutes(30),
oldTicket.IsPersistent,
oldTicket.UserData,
FormsAuthentication.FormsCookiePath);
cookie.Domain = cookieDomain;
cookie.Value = FormsAuthentication.Encrypt(newTicket);
//更新 cookie
HttpContext.Current.Response.SetCookie(cookie);
2). 修改使用者退出時的方法
HttpCookie cookie = HttpContext.Current.Response.Cookies[FormsAuthentication.FormsCookieName];
cookie.Domain = cookieDomain;
cookie.Value = null;
cookie.Expires = DateTime.Now.AddDays(-1);
//更新cookie
HttpContext.Current.Response.Cookies.SetCookie(cookie);
FormsAuthentication.SignOut();
但是如果按照以上的做法的是無法擷取到 Identity.Name 的. 經過分析和尋找了相關的資料後將以上方法修改成
1).
//設定使用者的 cookie 的值
FormsAuthentication.SetAuthCookie(loginName, false);
//擷取使用者的 cookie
HttpCookie cookie = FormsAuthentication.GetAuthCookie(loginName, false);
//給使用者的 cookie 的值加上 cookie 的域 和 到期日期
//向用戶端重寫同名的 使用者 cookie
FormsAuthenticationTicket oldTicket = FormsAuthentication.Decrypt(cookie.Value);
FormsAuthenticationTicket newTicket = new FormsAuthenticationTicket(1,
oldTicket.Name,
oldTicket.IssueDate,
DateTime.Now.AddMinutes(30),
oldTicket.IsPersistent,
oldTicket.UserData,
FormsAuthentication.FormsCookiePath);
cookie.Domain = cookieDomain;
cookie.Value = FormsAuthentication.Encrypt(newTicket);
HttpContext.Current.Response.Cookies.Add(cookie);
2).
HttpCookie cookie = HttpContext.Current.Response.Cookies[FormsAuthentication.FormsCookieName];
cookie.Domain = cookieDomain;
cookie.Value = null;
cookie.Expires = DateTime.Now.AddDays(-1);
HttpContext.Current.Response.Cookies.Add(cookie);
FormsAuthentication.SignOut();
這樣的話使用者就可以成功登陸和退出了!
可能的原因我估計是cookie 有伺服器和用戶端之分.所以才會從新產生一個驗證票據讓之前同名的失效.