四年前有寫過利用MVC架構建立Form 表單驗證
這次又有新的前輩寫的火星文web form版本的表單驗證
以下就來一一破解一下
首先,
利用web form的架構下都會以web.config去設定一些有的沒的
首先,在config 中利用authenticution 設定好的login 的頁面
<authentication mode="Forms">
<forms protection="All" timeout="480" slidingExpiration="true" cookieless="UseDeviceProfile" loginUrl="backend/login.aspx" defaultUrl="backend/index.aspx" requireSSL="false" enableCrossAppRedirects="false">
<credentials passwordFormat="SHA1" />
</forms>
</authentication>
上面提到可見文件來了解每個項目的定義
接著實作backend/login.aspx,進行帳密的驗證
驗證成功後透過FormsAuthentication類別去寫入cookie
FormsAuthentication.RedirectFromLoginPage
(UsernameTextbox.Text, NotPublicCheckBox.Checked);
但天殺的前輩就要用FormsAuthenticationticket用自已的力量寫一次cookie
結果就會像下面這樣
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, user.Name, DateTime.Now, DateTime.Now.AddHours(8), true, user.Serno.ToString());
string encryptedTicket = FormsAuthentication.Encrypt(ticket);
HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
authCookie.Expires = ticket.Expiration;
Response.Cookies.Add(authCookie);
那...config其實也不用設到這麼多參數了!!
那經過幾年後,問題來了,這個網站有四個相似的網站,分別for不同的狀態去操作
都架在同一個網域下的情況,就會發生明明是不同網站卻cookie互蓋的問題
主要就是同網域都把cookie寫在path:/ 下,那有二個解法:
1.cookie 名稱都取不同
2.path改位置
這裡用2這個項目進行調整,因為網站本來就放在同一個網域不同的子資料夾下,就直覺用path區分不同網站所存取的驗證cookie
首先在web.confg增加path這個參數設定
<forms protection="All" timeout="480" slidingExpiration="true" cookieless="UseDeviceProfile" loginUrl="backend/login.aspx" defaultUrl="backend/index.aspx" requireSSL="false" enableCrossAppRedirects="false" path="/a">
接著因為在login.aspx.cs中前輩又自已寫了add cookie段,也需要跟著調整,參數可見
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, user.Name, DateTime.Now, DateTime.Now.AddHours(8), true, user.Serno.ToString(),FormsAuthentication.FormsCookiePath);
於似乎就能解決同一個網域下發生明明是不同網站卻cookie互蓋的問題
後記:因為logout.aspx.cs 也被「手動」的remove一些cookie,這些都是key point要注意連同修改cookie 路徑,以省的還是有被蓋的問題