The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

簡介 ASP.NET 表單驗證 (FormsAuthentication) 的運作方式

我個人實在沒太多時間解釋整個 Forms Authentication 的運作機制,不過有些不錯的文章可以介紹給大家看。

ASP.NET Forms Authentication

常見應用情境

  1. 最簡單的登入方式

    透過 FormsAuthentication 類別中的一個 RedirectFromLoginPage 靜態方法,這是最簡單、最無腦的一段程式碼:

    string strUsername = "will";
    
    FormsAuthentication.RedirectFromLoginPage(strUsername, false);
    

    基本上,只要執行這段程式碼,就會自動回應一個名為 .ASPXAUTH 的 Cookie 給用戶端瀏覽器,使用者就會是「登入」狀態了。

  2. 判斷使用者是否是「已登入」狀態

    if(User.Identity.IsAuthenticated)
    {
        Response.Write("您現在是已登入狀態。");
    }
    
  3. 取得登入者的帳號

    string strLoginID = User.Identity.Name;
    

    使用這段程式碼要注意,如果使用者「尚未登入」的話 User.Identity 會回傳 null 回來,進而導致使用 User.Identity.Name 時發生 Exception !!

  4. 自訂更細緻的登入過程

    雖然你可以很輕易的執行「登入」動作,但是預設來說 ASP.NET 2.0 的 Forms Authentication 是使用 Cookie 來做儲存登入資訊的動作,且預設的過期時間是 30 分鐘,如果希望設定成 Browser 全部關閉後會自動登出的話,就必須採用自訂 Forms Authentication Cookie 的方式,程式碼片段如下:

    string userData = "ApplicationSpecific data for this user";
    
    string strUsername = "你想要存放在 User.Identy.Name 的值,通常是使用者帳號";
    
    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
      strUsername,
      DateTime.Now,
      DateTime.Now.AddMinutes(30),
      isPersistent,
      userData,
      FormsAuthentication.FormsCookiePath);
    
    // Encrypt the ticket.
    string encTicket = FormsAuthentication.Encrypt(ticket);
    
    // Create the cookie.
    Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));
    

    以上這段程式碼片段就是用來產生 Forms Authentication 的 Ticket,並將取得的 Ticket 編碼後設定儲存在使用者 Browser 的 Cookie 中。但其中有個參數叫做 "userData",我也是研究了一下子才知道怎麼用他,想知道的人可以參考 FormsAuthenticationTicket.UserData 屬性。

    所以要取得登入時設定的 userData 的方式,可以參考以下程式片段:

    FormsIdentity id = (FormsIdentity)User.Identity;
    FormsAuthenticationTicket ticket = id.Ticket;
    
    cookiePath.Text   = ticket.CookiePath;
    expireDate.Text   = ticket.Expiration.ToString();
    expired.Text      = ticket.Expired.ToString();
    isPersistent.Text = ticket.IsPersistent.ToString();
    issueDate.Text    = ticket.IssueDate.ToString();
    name.Text         = ticket.Name;
    userData.Text     = ticket.UserData;
    version.Text      = ticket.Version.ToString();
    

    但是有點要特別注意,就是您應該要限制儲存在 UserData 屬性中的資料量,因為 UserData 屬性所設定的資料最後會加密後儲存在 Cookie 中,雖然在 RFC 2109 HTTP State Management Mechanism 規範的 6.3 Implementation Limits 中有定義 User Agent (瀏覽器) 針對 Cookie 的最低儲存量,但是其 Cookie 的儲存量還是有其限制的,如果你設定超過了其限制,就有可能造成怎樣都無法登入成功的狀況!

  5. 登出帳號

    最後,如果你要登出的話,可以用以下程式碼片段:

    FormsAuthentication.SignOut();
    

關於 Web.config 的設定

如果 ASP.NET Forms Authentication 沒辦法順利執行,有可能是因為 Web.config 設定錯誤或因為較新版本的 .NET Framework 版本的預設值變更導致的,建議參考以下範例進行設定,這裡的重點在 <system.web> 底下的 <authentication mode="Forms"> 設定!

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  ...
  <system.web>
    
    ...
    
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login.aspx" timeout="2880" />
    </authentication>
    
    ...
    
  </system.web>
  ...
</configuration>

相關連結