2020年10月19日 星期一

{WebForm}Forms驗證 登入登出頁

 四年前有寫過利用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 路徑,以省的還是有被蓋的問題