溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

asp.net中Forms身份驗證的示例分析

發(fā)布時間:2021-09-01 11:59:46 來源:億速云 閱讀:99 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要為大家展示了“asp.net中Forms身份驗證的示例分析”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學習一下“asp.net中Forms身份驗證的示例分析”這篇文章吧。

在做網(wǎng)站的時候,都會用到用戶登錄的功能。對于一些敏感的資源,我們只希望被授權(quán)的用戶才能夠訪問,這讓然需要用戶的身份驗證。對于初學者,通常將用戶登錄信息存放在Session中,筆者在剛接觸到asp.net的時候就是這么做的。當我將用戶信息存在在Session中時,常常會遇到Session丟失導致用戶無法正常訪問被授權(quán)的資源,保持用戶登錄狀態(tài)時的安全性問題,無休其實,在asp.net中,我們有更好的解決方案,那就是通過Forms身份驗證,從而對用戶進行授權(quán),這種方法可以輕松的保持用戶的登錄狀態(tài)(如果用戶想這樣),便捷的用戶授權(quán)配置,增強的安全性等好處。

在做例子之前,我們先定義如下用戶類,類名為SampleUser,代碼如下:

public partial class SampleUser
  {
    string username;
    public string UserName
    {
      get { return username; }
      set { username = value; }
    }

    string userpwd;
    public string UserPWD
    {
      get { return userpwd; }
      set { userpwd = value; }
    }

    public override bool Equals(object obj)
    {
      SampleUser other = obj as SampleUser;
      if (other == null || other.UserName != this.UserName)
        return false;
      return true;
    }
  }

  public partial class SampleUser
  {
    public static List<SampleUser> userList = new List<SampleUser> {
      new SampleUser() { UserName = "01", UserPWD = "123"}, 
      new SampleUser() { UserName = "02", UserPWD = "123" }, 
      new SampleUser() { UserName = "03", UserPWD = "123" }, 
      new SampleUser() { UserName = "04", UserPWD = "123" }, 
    };

    public static SampleUser GetUser(string userName)
    {
      return userList.Find(u=>u.UserName == userName);
    }
  }

在類SampleUser中,定義了UserName和UserPWD兩個字段,分別用來存儲用戶的登錄名和密碼信息。在SampleUser類的另一部分中,我們提供了一個用戶的靜態(tài)類表,用來代替存儲在數(shù)據(jù)庫中的用戶信息,提供一個方法GetUser,用來獲取用戶信息。

在這個例子中,我們演示用戶必須進行登錄才能訪問網(wǎng)站的資源,如果沒有登錄,則將用戶導航到login.aspx頁面中。

第一步,在web.config中添加配置信息,說明網(wǎng)站要使用Forms身份驗證,并指定登錄頁面和默認登錄成功后的跳轉(zhuǎn)頁面,然后指定拒絕未登錄用戶的訪問,代碼如下:

<authentication mode="Forms">
   <forms loginUrl="~/Login.aspx" defaultUrl="~/Default.aspx" />
  </authentication>
  <authorization>
   <deny users="?"/>
  </authorization>

完成這一步后,我們再打開Default.aspx頁面,在沒有登錄的情況下,頁面會被導航到Login.aspx頁面,我們的第一步的目的已經(jīng)達到了。

第二步,完成Login.aspx的頁面邏輯。在頁面中添加兩個TextBox控件,用來輸入用戶名和密碼;添加一個CheckBox控件,用來選擇是否保持登錄狀態(tài);添加一個Button控件,響應(yīng)用戶的登錄操作。相應(yīng)的代碼如下:

<fieldset>
    <legend>用戶登陸</legend>
    <div>
      用戶名:<asp:TextBox ID="txtUserID" runat="server" Width="150" /><br /><br />
      密&nbsp;&nbsp;&nbsp;碼:<asp:TextBox ID="txtUserPWD" runat="server" TextMode="Password" Width="150" /><br /><br />
      <asp:CheckBox ID="cbSaveUserName" runat="server" Checked="true" Text="保持登錄狀態(tài)" />
    </div><br />
    <asp:Literal ID="ltMessage" Text="" runat="server" Visible="false" />
    <br />
    <p>
      <asp:Button ID="btnLogin" Text="登陸" runat="server" OnClick="btnLogin_Click" />
    </p>
  </fieldset>

接下來完成后臺代碼,添加登陸按鈕的后臺處理方法:對用戶名和密碼進行驗證,如果驗證通過,則為用戶名創(chuàng)建一個身份驗證票據(jù),并將其添加到響應(yīng)的Cookie中。代碼如下:

protected void btnLogin_Click(object sender, EventArgs e)
    {
      string userID = this.txtUserID.Text.Trim();
      string userPWD = this.txtUserPWD.Text.Trim();

      SampleUser userEx = SampleUser.GetUser(userID);
      if (userEx == null)
      {
        ltMessage.Text = "用戶不存在!";
        ltMessage.Visible = true;
        return;
      }

      if (userEx.UserPWD != userPWD)
      {
        ltMessage.Text = "用戶名或密碼錯誤,請重新輸入!";
        ltMessage.Visible = true;
        return;
      }

      //添加票據(jù),并將用戶導航到默認頁面
      FormsAuthentication.RedirectFromLoginPage(userEx.UserName, this.cbSaveUserName.Checked);
    }

完成這一步后,我們就已經(jīng)完成了簡單Froms驗證的功能。運行程序,你會發(fā)現(xiàn),這里存在一個問題?。?!

你發(fā)現(xiàn)了嗎?當我們被導航到login.aspx時,這個頁面的樣式丟失了!這是因為我們對整個網(wǎng)站的資源進行了訪問限制,如果沒有登陸,用戶不僅無法訪問.aspx頁面,甚至連css文件、js文件都無法訪問。顯然,這不是我們想要的,因為這些資源并不是敏感的資源。在通常情況下,我們只希望對部分文件夾中的文件進行驗證訪問限制,而不是整個網(wǎng)站,例如,我們允許只對User文件夾下的頁面進行訪問限制,因為這個文件夾中存放的是用戶的私人信息,這些信息是敏感的。這該如何實現(xiàn)呢?

為了完成演示分目錄驗證,我們在項目中添加一個User文件夾,并添加UserInfo.aspx、 UserLogin.aspx兩個頁面。UserInfo.aspx用來展示用戶信息,它的業(yè)務(wù)邏輯我們不是我們關(guān)心的,UserLogin.aspx頁面用來讓用戶登陸,代碼跟Login.aspx頁面幾乎完全相同。

第一步:修改Web.config文件,允許匿名用戶訪問系統(tǒng)資源。

 <authorization>
   <allow users="?"/>
  </authorization>

第二步:在User文件夾下添加一個Web.config文件,修改代碼,拒絕匿名用戶訪問該文件夾下的資源。

   <authorization>
    <deny users="?"/>
   </authorization>

完成這兩步后,我們訪問UserInfo.aspx時,如果沒有登陸,則會被導航到~/User/UserLogin.aspx頁面,當?shù)顷懞?,又會被導航到~/User/UserInfo.aspx頁面。這個時侯,我們的登陸頁面樣式并沒有丟失,這說明我們的配置文件起作用了。

接下來,我們想在UserInfo.aspx頁面中顯示出已登陸用戶的用戶名和密碼(這里完全是為了演示如何獲取登陸用戶數(shù)據(jù)才這樣做的,通常用戶的密碼是不會展示的)。在進行登陸后,用戶的票據(jù)信息被加密保存在Cookie中,這個票據(jù)中,有已登錄用戶的名稱信息,我們通過獲取票據(jù)中的用戶名,即可獲取到完整的用戶信息。

為了顯示用戶信息,我們在頁面中放置兩個Label控件,代碼如下:

<h3>
<p>用戶名:<asp:Label ID="lblUserName" Text="" runat="server" /></p>
<p>密&nbsp;&nbsp;&nbsp;&nbsp;碼:<asp:Label ID="lblUserPWD" Text="" runat="server" /></p>
</h3>

然后,我們在頁面的Load方法中,獲取并展示用戶信息:

if (this.Context.User != null && this.Context.User.Identity != null && this.Context.User.Identity.IsAuthenticated)
{
  SampleUser user = SampleUser.GetUser(this.Context.User.Identity.Name);
  if (user != null)
  {
    this.lblUserName.Text = user.UserName;
    this.lblUserPWD.Text = user.UserPWD;
  }
}

再次運行我們的代碼,當用戶登陸后(如果保持登陸狀態(tài),即使關(guān)掉并重新打開瀏覽器),我們都可以獲取到已登錄用戶的Name,從而獲取用戶的對象。

如果要退出登陸,我們只需要刪除保存在Cookie中的票證信息即可,這個功能Forms驗證已經(jīng)幫我們完成,代碼很簡單:

FormsAuthentication.SignOut();  //退出登陸

在本文中,沒有涉及到角色的驗證,這是因為通過在配置文件中指定角色這種方法并不夠靈活,如果角色是可以在程序中維護的,那么我們在這里的指定就形同虛設(shè)了。感興趣的朋友可以自行學習,也并不復(fù)雜。在本文的結(jié)尾,附上詳細的Forms驗證在Web.config中的配置說明:

<forms 
   name="name" 
   loginUrl="URL" 
   defaultUrl="URL"
   protection="[All|None|Encryption|Validation]"
   timeout="[MM]"
   path="path"
   requireSSL="[true|false]"
   slidingExpiration="[true|false]">
   enableCrossAppRedirects="[true|false]"
   cookieless="[UseUri|UseCookie|AutoDetect|UseDeviceProfile]" 
   domain="domain name"
   ticketCompatibilityMode="[Framework20|Framework40]">
   <credentials>...</credentials>
 </forms>
  • name:指定要用于身份驗證的 HTTP Cookie。如果正在一臺服務(wù)器上運行多個應(yīng)用程序并且每個應(yīng)用程序都需要唯一的 Cookie,則必須在每個應(yīng)用程序的 Web.config 文件中配置 Cookie 名稱。默認值為 ".ASPXAUTH"。

  • loginUrl:指定如果找不到任何有效的身份驗證 Cookie,將請求重定向到的用于登錄的 URL。默認值為 login.aspx。

  • defaultUrl:定義在身份驗證之后用于重定向的默認 URL。默認值為 "default.aspx"。

  • protection:指定 Cookie 使用的加密類型(如果有)。默認值為 All。

  • timeout:指定 Cookie 過期前逝去的時間(以整數(shù)分鐘為單位)。如果 SlidingExpiration 屬性為 true,則 timeout 屬性是滑動值,會在接收到上一個請求之后的指定時間(以分鐘為單位)后過期。 為防止危及性能并避免向開啟 Cookie 警告的用戶發(fā)出多個瀏覽器警告,當指定的時間逝去大半時將更新 Cookie。這可能導致精確性受損。默認值為 "30"(30 分鐘)。

  • path:為應(yīng)用程序發(fā)出的 Cookie 指定路徑。默認值是斜杠 ( /),這是因為大多數(shù)瀏覽器是區(qū)分大小寫的,如果路徑大小寫不匹配,瀏覽器不會送回 Cookie。

  • requireSSL:指定是否需要 SSL 連接來傳輸身份驗證 Cookie。默認值為 False。

  • slidingExpiration:指定是否啟用可調(diào)過期時間??烧{(diào)過期將 Cookie 的當前身份驗證時間重置為在單個會話期間收到每個請求時過期。默認值為 True。

  • enableCrossAppRedirects:表明是否將通過身份驗證的用戶重定向到其他 Web 應(yīng)用程序中的 URL。默認值為 False。

  • cookieless:定義是否使用 Cookie 以及 Cookie 的行為。默認值為 UseDeviceProfile.

  • domain:指定在傳出 Forms 身份驗證 Cookie 中設(shè)置的可選域。此設(shè)置的優(yōu)先級高于 httpCookies 元素中使用的域。默認值為空字符串 ("")。

  • ticketCompatibilityMode:指定在 Forms 身份驗證中對于票證到期日期使用協(xié)調(diào)世界時 (UTC) 還是本地時間。默認值為 Framework20。

子元素 credentials:允許選擇在配置文件中定義名稱和密碼憑據(jù)。您還可以實現(xiàn)自定義的密碼架構(gòu),以使用外部源(如數(shù)據(jù)庫)來控制驗證。

以上是“asp.net中Forms身份驗證的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI