Forms 驗證FormsAuthentication

來源:互聯網
上載者:User

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 有伺服器和用戶端之分.所以才會從新產生一個驗證票據讓之前同名的失效.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.