這篇文章主要為大家展示了“asp.net中Forms身份驗(yàn)證的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“asp.net中Forms身份驗(yàn)證的示例分析”這篇文章吧。
創(chuàng)新互聯(lián)主營(yíng)漢壽網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,重慶APP開(kāi)發(fā)公司,漢壽h5小程序設(shè)計(jì)搭建,漢壽網(wǎng)站營(yíng)銷(xiāo)推廣歡迎漢壽等地區(qū)企業(yè)咨詢(xún)在做網(wǎng)站的時(shí)候,都會(huì)用到用戶(hù)登錄的功能。對(duì)于一些敏感的資源,我們只希望被授權(quán)的用戶(hù)才能夠訪問(wèn),這讓然需要用戶(hù)的身份驗(yàn)證。對(duì)于初學(xué)者,通常將用戶(hù)登錄信息存放在Session中,筆者在剛接觸到asp.net的時(shí)候就是這么做的。當(dāng)我將用戶(hù)信息存在在Session中時(shí),常常會(huì)遇到Session丟失導(dǎo)致用戶(hù)無(wú)法正常訪問(wèn)被授權(quán)的資源,保持用戶(hù)登錄狀態(tài)時(shí)的安全性問(wèn)題,無(wú)休其實(shí),在asp.net中,我們有更好的解決方案,那就是通過(guò)Forms身份驗(yàn)證,從而對(duì)用戶(hù)進(jìn)行授權(quán),這種方法可以輕松的保持用戶(hù)的登錄狀態(tài)(如果用戶(hù)想這樣),便捷的用戶(hù)授權(quán)配置,增強(qiáng)的安全性等好處。
在做例子之前,我們先定義如下用戶(hù)類(lèi),類(lèi)名為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); } }
在類(lèi)SampleUser中,定義了UserName和UserPWD兩個(gè)字段,分別用來(lái)存儲(chǔ)用戶(hù)的登錄名和密碼信息。在SampleUser類(lèi)的另一部分中,我們提供了一個(gè)用戶(hù)的靜態(tài)類(lèi)表,用來(lái)代替存儲(chǔ)在數(shù)據(jù)庫(kù)中的用戶(hù)信息,提供一個(gè)方法GetUser,用來(lái)獲取用戶(hù)信息。
在這個(gè)例子中,我們演示用戶(hù)必須進(jìn)行登錄才能訪問(wèn)網(wǎng)站的資源,如果沒(méi)有登錄,則將用戶(hù)導(dǎo)航到login.aspx頁(yè)面中。
第一步,在web.config中添加配置信息,說(shuō)明網(wǎng)站要使用Forms身份驗(yàn)證,并指定登錄頁(yè)面和默認(rèn)登錄成功后的跳轉(zhuǎn)頁(yè)面,然后指定拒絕未登錄用戶(hù)的訪問(wèn),代碼如下:
<authentication mode="Forms"> <forms loginUrl="~/Login.aspx" defaultUrl="~/Default.aspx" /> </authentication> <authorization> <deny users="?"/> </authorization>
完成這一步后,我們?cè)俅蜷_(kāi)Default.aspx頁(yè)面,在沒(méi)有登錄的情況下,頁(yè)面會(huì)被導(dǎo)航到Login.aspx頁(yè)面,我們的第一步的目的已經(jīng)達(dá)到了。
第二步,完成Login.aspx的頁(yè)面邏輯。在頁(yè)面中添加兩個(gè)TextBox控件,用來(lái)輸入用戶(hù)名和密碼;添加一個(gè)CheckBox控件,用來(lái)選擇是否保持登錄狀態(tài);添加一個(gè)Button控件,響應(yīng)用戶(hù)的登錄操作。相應(yīng)的代碼如下:
<fieldset> <legend>用戶(hù)登陸</legend> <div> 用戶(hù)名:<asp:TextBox ID="txtUserID" runat="server" Width="150" /><br /><br /> 密 碼:<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>
接下來(lái)完成后臺(tái)代碼,添加登陸按鈕的后臺(tái)處理方法:對(duì)用戶(hù)名和密碼進(jìn)行驗(yàn)證,如果驗(yàn)證通過(guò),則為用戶(hù)名創(chuàng)建一個(gè)身份驗(yàn)證票據(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 = "用戶(hù)不存在!"; ltMessage.Visible = true; return; } if (userEx.UserPWD != userPWD) { ltMessage.Text = "用戶(hù)名或密碼錯(cuò)誤,請(qǐng)重新輸入!"; ltMessage.Visible = true; return; } //添加票據(jù),并將用戶(hù)導(dǎo)航到默認(rèn)頁(yè)面 FormsAuthentication.RedirectFromLoginPage(userEx.UserName, this.cbSaveUserName.Checked); }
完成這一步后,我們就已經(jīng)完成了簡(jiǎn)單Froms驗(yàn)證的功能。運(yùn)行程序,你會(huì)發(fā)現(xiàn),這里存在一個(gè)問(wèn)題?。?!
你發(fā)現(xiàn)了嗎?當(dāng)我們被導(dǎo)航到login.aspx時(shí),這個(gè)頁(yè)面的樣式丟失了!這是因?yàn)槲覀儗?duì)整個(gè)網(wǎng)站的資源進(jìn)行了訪問(wèn)限制,如果沒(méi)有登陸,用戶(hù)不僅無(wú)法訪問(wèn).aspx頁(yè)面,甚至連css文件、js文件都無(wú)法訪問(wèn)。顯然,這不是我們想要的,因?yàn)檫@些資源并不是敏感的資源。在通常情況下,我們只希望對(duì)部分文件夾中的文件進(jìn)行驗(yàn)證訪問(wèn)限制,而不是整個(gè)網(wǎng)站,例如,我們?cè)试S只對(duì)User文件夾下的頁(yè)面進(jìn)行訪問(wèn)限制,因?yàn)檫@個(gè)文件夾中存放的是用戶(hù)的私人信息,這些信息是敏感的。這該如何實(shí)現(xiàn)呢?
為了完成演示分目錄驗(yàn)證,我們?cè)陧?xiàng)目中添加一個(gè)User文件夾,并添加UserInfo.aspx、 UserLogin.aspx兩個(gè)頁(yè)面。UserInfo.aspx用來(lái)展示用戶(hù)信息,它的業(yè)務(wù)邏輯我們不是我們關(guān)心的,UserLogin.aspx頁(yè)面用來(lái)讓用戶(hù)登陸,代碼跟Login.aspx頁(yè)面幾乎完全相同。
第一步:修改Web.config文件,允許匿名用戶(hù)訪問(wèn)系統(tǒng)資源。
<authorization> <allow users="?"/> </authorization>
第二步:在User文件夾下添加一個(gè)Web.config文件,修改代碼,拒絕匿名用戶(hù)訪問(wèn)該文件夾下的資源。
<authorization> <deny users="?"/> </authorization>
完成這兩步后,我們?cè)L問(wèn)UserInfo.aspx時(shí),如果沒(méi)有登陸,則會(huì)被導(dǎo)航到~/User/UserLogin.aspx頁(yè)面,當(dāng)?shù)顷懞?,又?huì)被導(dǎo)航到~/User/UserInfo.aspx頁(yè)面。這個(gè)時(shí)侯,我們的登陸頁(yè)面樣式并沒(méi)有丟失,這說(shuō)明我們的配置文件起作用了。
接下來(lái),我們想在UserInfo.aspx頁(yè)面中顯示出已登陸用戶(hù)的用戶(hù)名和密碼(這里完全是為了演示如何獲取登陸用戶(hù)數(shù)據(jù)才這樣做的,通常用戶(hù)的密碼是不會(huì)展示的)。在進(jìn)行登陸后,用戶(hù)的票據(jù)信息被加密保存在Cookie中,這個(gè)票據(jù)中,有已登錄用戶(hù)的名稱(chēng)信息,我們通過(guò)獲取票據(jù)中的用戶(hù)名,即可獲取到完整的用戶(hù)信息。
為了顯示用戶(hù)信息,我們?cè)陧?yè)面中放置兩個(gè)Label控件,代碼如下:
<h3> <p>用戶(hù)名:<asp:Label ID="lblUserName" Text="" runat="server" /></p> <p>密 碼:<asp:Label ID="lblUserPWD" Text="" runat="server" /></p> </h3>
然后,我們?cè)陧?yè)面的Load方法中,獲取并展示用戶(hù)信息:
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; } }
再次運(yùn)行我們的代碼,當(dāng)用戶(hù)登陸后(如果保持登陸狀態(tài),即使關(guān)掉并重新打開(kāi)瀏覽器),我們都可以獲取到已登錄用戶(hù)的Name,從而獲取用戶(hù)的對(duì)象。
如果要退出登陸,我們只需要?jiǎng)h除保存在Cookie中的票證信息即可,這個(gè)功能Forms驗(yàn)證已經(jīng)幫我們完成,代碼很簡(jiǎn)單:
FormsAuthentication.SignOut(); //退出登陸
在本文中,沒(méi)有涉及到角色的驗(yàn)證,這是因?yàn)橥ㄟ^(guò)在配置文件中指定角色這種方法并不夠靈活,如果角色是可以在程序中維護(hù)的,那么我們?cè)谶@里的指定就形同虛設(shè)了。感興趣的朋友可以自行學(xué)習(xí),也并不復(fù)雜。在本文的結(jié)尾,附上詳細(xì)的Forms驗(yàn)證在Web.config中的配置說(shuō)明:
<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:指定要用于身份驗(yàn)證的 HTTP Cookie。如果正在一臺(tái)服務(wù)器上運(yùn)行多個(gè)應(yīng)用程序并且每個(gè)應(yīng)用程序都需要的 Cookie,則必須在每個(gè)應(yīng)用程序的 Web.config 文件中配置 Cookie 名稱(chēng)。默認(rèn)值為 ".ASPXAUTH"。
loginUrl:指定如果找不到任何有效的身份驗(yàn)證 Cookie,將請(qǐng)求重定向到的用于登錄的 URL。默認(rèn)值為 login.aspx。
defaultUrl:定義在身份驗(yàn)證之后用于重定向的默認(rèn) URL。默認(rèn)值為 "default.aspx"。
protection:指定 Cookie 使用的加密類(lèi)型(如果有)。默認(rèn)值為 All。
timeout:指定 Cookie 過(guò)期前逝去的時(shí)間(以整數(shù)分鐘為單位)。如果 SlidingExpiration 屬性為 true,則 timeout 屬性是滑動(dòng)值,會(huì)在接收到上一個(gè)請(qǐng)求之后的指定時(shí)間(以分鐘為單位)后過(guò)期。 為防止危及性能并避免向開(kāi)啟 Cookie 警告的用戶(hù)發(fā)出多個(gè)瀏覽器警告,當(dāng)指定的時(shí)間逝去大半時(shí)將更新 Cookie。這可能導(dǎo)致精確性受損。默認(rèn)值為 "30"(30 分鐘)。
path:為應(yīng)用程序發(fā)出的 Cookie 指定路徑。默認(rèn)值是斜杠 ( /),這是因?yàn)榇蠖鄶?shù)瀏覽器是區(qū)分大小寫(xiě)的,如果路徑大小寫(xiě)不匹配,瀏覽器不會(huì)送回 Cookie。
requireSSL:指定是否需要 SSL 連接來(lái)傳輸身份驗(yàn)證 Cookie。默認(rèn)值為 False。
slidingExpiration:指定是否啟用可調(diào)過(guò)期時(shí)間??烧{(diào)過(guò)期將 Cookie 的當(dāng)前身份驗(yàn)證時(shí)間重置為在單個(gè)會(huì)話期間收到每個(gè)請(qǐng)求時(shí)過(guò)期。默認(rèn)值為 True。
enableCrossAppRedirects:表明是否將通過(guò)身份驗(yàn)證的用戶(hù)重定向到其他 Web 應(yīng)用程序中的 URL。默認(rèn)值為 False。
cookieless:定義是否使用 Cookie 以及 Cookie 的行為。默認(rèn)值為 UseDeviceProfile.
domain:指定在傳出 Forms 身份驗(yàn)證 Cookie 中設(shè)置的可選域。此設(shè)置的優(yōu)先級(jí)高于 httpCookies 元素中使用的域。默認(rèn)值為空字符串 ("")。
ticketCompatibilityMode:指定在 Forms 身份驗(yàn)證中對(duì)于票證到期日期使用協(xié)調(diào)世界時(shí) (UTC) 還是本地時(shí)間。默認(rèn)值為 Framework20。
子元素 credentials:允許選擇在配置文件中定義名稱(chēng)和密碼憑據(jù)。您還可以實(shí)現(xiàn)自定義的密碼架構(gòu),以使用外部源(如數(shù)據(jù)庫(kù))來(lái)控制驗(yàn)證。
以上是“asp.net中Forms身份驗(yàn)證的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
分享名稱(chēng):asp.net中Forms身份驗(yàn)證的示例分析-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)地址:http://vcdvsql.cn/article24/phgce.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、網(wǎng)站制作、用戶(hù)體驗(yàn)、網(wǎng)站導(dǎo)航、定制開(kāi)發(fā)、域名注冊(cè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容
營(yíng)銷(xiāo)型網(wǎng)站建設(shè)知識(shí)