也談Asp.net 中的身份驗(yàn)證
錢李峰 的這篇博文《Asp.net中的認(rèn)證與授權(quán)》已對(duì)Asp.net 中的身份驗(yàn)證進(jìn)行了不錯(cuò)實(shí)踐。而我這篇博文,是從初學(xué)者的角度補(bǔ)充了一些基礎(chǔ)的概念,以便能有個(gè)清晰的認(rèn)識(shí)。
一、配置安全身份驗(yàn)證模式
在Web.config 文件中,通過 <authentication> 節(jié)可以配置 ASP.NET 使用的安全身份驗(yàn)證模式,以標(biāo)識(shí)傳入的用戶。
<authentication mode="[Windows|Forms|Passport|None]"> <forms>...</forms> <passport/> </authentication>
<authentication> 節(jié)的mode 為必選的屬性。指定應(yīng)用程序的默認(rèn)身份驗(yàn)證模式。
此屬性可以為下列值之一:
○ Windows :將 Windows 驗(yàn)證指定為默認(rèn)的身份驗(yàn)證模式。將它與以下任意形式的 Microsoft Internet 信息服務(wù) (IIS) 身份驗(yàn)證結(jié)合起來使用:基本、摘要、集成 Windows 身份驗(yàn)證 (NTLM/Kerberos) 或證書。在這種情況下,您的應(yīng)用程序?qū)⑸矸蒡?yàn)證責(zé)任委托給基礎(chǔ) IIS。
○ Forms :將 ASP.NET 基于窗體的身份驗(yàn)證指定為默認(rèn)身份驗(yàn)證模式。
○ Passport :將 Microsoft Passport Network 身份驗(yàn)證指定為默認(rèn)身份驗(yàn)證模式。
○ None :不指定任何身份驗(yàn)證。您的應(yīng)用程序僅期待匿名用戶,否則它將提供自己的身份驗(yàn)證。
默認(rèn)值為 Windows。
二、設(shè)置基于窗體的身份驗(yàn)證
當(dāng)ASP.NET 基于窗體的身份驗(yàn)證<authentication mode="Forms"> 時(shí),其<forms> 子節(jié)點(diǎn)為窗體自定義身份驗(yàn)證配置。
示例如下:
<authentication mode="Forms"> <forms cookieless="UseDeviceProfile" defaultUrl="Default.aspx" loginUrl="Login.aspx" name="cnblogs" slidingExpiration="false" timeout="15" /> </authentication>
○ cookieless :定義是否使用 Cookie 以及 Cookie 的行為。默認(rèn)值為 UseDeviceProfile ;
○ defaultUrl :定義在身份驗(yàn)證之后用于重定向的默認(rèn) URL。默認(rèn)值為 default.aspx ;
○ loginUrl :指定如果找不到任何有效的身份驗(yàn)證 Cookie,將請(qǐng)求重定向到的用于登錄的 URL。默認(rèn)值為 login.aspx ;
○ name :指定要用于身份驗(yàn)證的 HTTP Cookie。默認(rèn)值為 ".ASPXAUTH" ;
如果正在一臺(tái)服務(wù)器上運(yùn)行多個(gè)應(yīng)用程序,并且每個(gè)應(yīng)用程序都需要唯一的Cookie,則必須在每個(gè)應(yīng)用程序的 Web.config 文件中配置 Cookie 名稱。
○ slidingExpiration :指定是否啟用彈性過期時(shí)間。
> True 指定啟用彈性過期時(shí)間。在單個(gè)會(huì)話期間,身份驗(yàn)證 Cookie 被刷新,并且每個(gè)后續(xù)請(qǐng)求的到期時(shí)間被重置。在 .NET Framework 1.x 版中,默認(rèn)值為 True。
> False 指定不啟用可調(diào)過期,并指定 Cookie 在最初發(fā)出之后,經(jīng)過一段設(shè)定的時(shí)間間隔后過期。在 .NET Framework 2.0 版中,默認(rèn)值為 False。
○ timeout :指定 Cookie 過期前逝去的時(shí)間(以整數(shù)分鐘為單位)。如果 SlidingExpiration 屬性為 true,則 timeout 屬性是滑動(dòng)值,會(huì)在接收到上一個(gè)請(qǐng)求之后的指定時(shí)間(以分鐘為單位)后過期。為防止危及性能并避免向開啟 Cookie 警告的用戶發(fā)出多個(gè)瀏覽器警告,當(dāng)指定的時(shí)間逝去大半時(shí)將更新 Cookie。這可能導(dǎo)致精確性受損。持久性 Cookie 不超時(shí)。默認(rèn)值為 "30"(30 分鐘)。
三、配置 Web 應(yīng)用程序的授權(quán)
接下來添加<authorization> 節(jié)配置 Web 應(yīng)用程序的授權(quán),以控制客戶端對(duì) URL 資源的訪問。
<authorization> <allow ...="" /> <deny ...="" /> </authorization>
<authorization> 授權(quán):順序是先寫allow,再寫deny,不然就會(huì)出現(xiàn)問題。
allow :向授權(quán)規(guī)則映射添加一個(gè)規(guī)則,該規(guī)則允許對(duì)資源進(jìn)行訪問。
deny :向授權(quán)規(guī)則映射添加一條拒絕對(duì)資源的訪問的授權(quán)規(guī)則。
示例如下:
<authorization> <deny users="?" /> </authorization>
<deny users="?" /> 表示拒絕訪問的用戶。問號(hào) (?) 表示拒絕匿名用戶;星號(hào) (*) 表示拒絕所有用戶訪問。若添加用戶名列表使用逗號(hào)分隔。
設(shè)置完畢后,Web.config 文件的整體配置如下:
<!-- 通過 <authentication> 節(jié)可以配置 ASP.NET 使用的 安全身份驗(yàn)證模式,以標(biāo)識(shí)傳入的用戶。 --> <authentication mode="Forms"> <forms cookieless="UseDeviceProfile" defaultUrl="Default.aspx" loginUrl="Login.aspx" name="newerSize" slidingExpiration="false" timeout="15" /> </authentication> <!-- <authorization>授權(quán):順序是先寫allow,再寫deny,不然就會(huì)出現(xiàn)問題。 --> <authorization> <deny users="?"/> </authorization>
四、在頁面程序中使用Forms 身份驗(yàn)證
在頁面程序的后臺(tái)代碼中,我們使用FormsAuthentication 類為Web 應(yīng)用程序管理 Forms 身份驗(yàn)證服務(wù)。
在登錄頁面Login.aspx 中,代碼如下:
//登錄 protected void btnLogin_Click(object sender, EventArgs e) { string name = txtName.Text.Trim(); string pwd = txtPwd.Text.Trim(); if ("Andy" == name && "123" == pwd) { //方式一 //FormsAuthentication.RedirectFromLoginPage(name, true); /*參數(shù)二為true:表示創(chuàng)建持久 Cookie(跨瀏覽器會(huì)話保存的 Cookie)*/ //方式二 //為用戶創(chuàng)建一個(gè)票證,并將其放入cookie或者url中(具體看你怎么設(shè)置票證的保存方式) FormsAuthentication.SetAuthCookie(name, true); Response.Redirect("Default.aspx"); } else { Response.Write("<script>alert('登錄失敗!')</script>"); } } //注銷 protected void btnExit_Click(object sender, EventArgs e) { //從瀏覽器刪除 Forms 身份驗(yàn)證票證。 FormsAuthentication.SignOut(); }
登錄成功后,跳轉(zhuǎn)到的默認(rèn)頁面Default.aspx 中,代碼如下:
protected void Page_Load(object sender, EventArgs e) { //User:獲取有關(guān)發(fā)出頁請(qǐng)求的用戶的信息。 string username = User.Identity.Name; Label1.Text = username + ":登錄成功!"; }
User.Identity.Name 用于獲得Cookie 中的用戶名。
| 作者: XuGang 網(wǎng)名:鋼鋼 |
| 出處: http://xugang.cnblogs.com |
| 聲明: 本文版權(quán)歸作者和博客園共有。轉(zhuǎn)載時(shí)必須保留此段聲明,且在文章頁面明顯位置給出原文連接地址! |
posted on 2010-12-08 13:22 鋼鋼 閱讀(7930) 評(píng)論(11) 收藏 舉報(bào)
浙公網(wǎng)安備 33010602011771號(hào)