asp.net
簡介
ASP開發人員總是自己解決認證問題,但ASP.NET已經支援內建的認證功能。在本篇文章中,我們將介紹如何這二者在認證方面有什麼變化,如何用很少的代碼使用FormsAuthentication使用網站更安全。
在ASP編程中,無論是使用整合的安全性通訊協定(例如Windows NT LAN Manager [NTLM]的尋問/應答認證協議),基本的安全性通訊協定(指純文字)還是自己建立的安全性通訊協定,其工作量都是十分驚人的。表格認證使開發人員能夠在Web.config檔案中儲存使用者名稱、口令等認證資訊,當然,也可以使用你自己原來的方法,例如資料庫、XML檔案或文字檔。使用表格認證最大的好處是它可以使我們無需再通過編程實現狀態跟蹤,這一部分工作由ASP.NET代勞了。
表格認證的背景知識
表格認證使用cookies使應用程式在使用者訪問期間對使用者進行跟蹤,ASP.NET處理表格認證的方法與在ASP中使用的方式非常相似。當使用者通過表格認證登入後,就會建立一個用來跟蹤使用者訪問網站期間活動的cookie。如果使用者請求一個安全的網頁,但又沒有登入,使用者就會被引導到登入網頁。一旦使用者通過認證,就會被引導到原來請求的頁面。
標準的表格認證設定
- 使用的網頁:Default.aspx、Login.aspx、Web.config。
- 在表格認證的標準方法中,所有的使用者資訊都被儲存在Web.config。
- 在互連網伺服器的根目錄下建立一個名字為standardForms的檔案夾。
- 使該檔案夾成為互連網服務管理員的一個應用。
Web.config概述
Web.config檔案包含ASP.NET應用程式的所有配置設定,其理念是讓許多開發人員共同控制Web應用程式,而不是由系統管理員一個人來控制。當然了,Web.config中有很多的選項,但今天我們只介紹與表格認證有關的選項。
使用標準或信任方法的Web.config代碼
認證
屬性描述名字:用於認證的cookie的名字。提示:如果多個應用要在同一台電腦上使用FormsAuthentication,最好使用不同的名字。路徑:cookie的路徑。預設的“/”值能夠避免路徑中的大小寫錯誤,因為在返回cookie上,瀏覽器是對大小寫敏感的。LoginUrl:未經認證的使用者被引導到的URL。保護:用來保護cookie資料的方法。預設和建議的值是“All”,它會進行確認和加密。Timeout:cookie結束前的時間(以分鐘計)。
認證
屬性描述口令格式:口令被儲存的格式,可用的值包括Clear、SHA1和MD5。SHA1和MD5是使口令在Web.config檔案中儲存更安全的雜湊演算法。使用者:用於儲存使用者名稱和口令。我們可以通過運行HashPasswordForStoringInConfigFile函數對口令進行雜湊處理,在後面我們會示範這種方法。
授權
屬性 描述拒絕 | 允許:這一小節拒絕或允許使用者訪問網站。?代表匿名或未被認證的使用者,*表示所有的使用者。另外,它還能讓我們向某一使用者授予允許或拒絕其他使用者訪問的許可權。
Web.config Code
<configuration>
<system.web>
<customErrors mode="Off"/>
<authentication mode="Forms">
<forms name="appNameAuth" path="/" loginUrl="login.aspx"
protection="All" timeout="30">
<credentials passwordFormat="Clear">
<user name="jeff" password="test" />
<user name="mike" password="test" />
</credentials>
</forms>
</authentication>
<authorization>
<deny users="?" />
</authorization>
</system.web>
</configuration>
Web.config細節
在上面的Web.config中,我們配置了幾個選項。
認證
配置小節的mode屬性設定表格的認證模式,在小節中我們將name屬性指定為“AppNameAuth”。也許想將cookie的名字改為“HRWebAuth”。
需要記住的是,如果在電腦上有多個應用,建議為每個cookie命名一個名字。
接下來,我們將path屬性設定為應用的根目錄,將loginUrl屬性設定為本地機上一個名字為loginUrl.aspx的網頁,當然我們也可以使用https://secured.sumnurv.com這樣的URL,將protection屬性設定為建議的“all”,這意味著cookie不但會被加密,還會被確認有效。
確認演算法來自Machine.config中的machineKey元素,資料確認有助於確保cookie的資料在傳輸的過程中不會被篡改。
timeout屬性指的是一個cookie終止、使用者再次登入之前的以分鐘計的時間。在credentials小節中,我們添加二個使用者以及它們的口令,FormsAuthentication將使用它們對使用者進行認證。
授權
在authorization小節中,我們希望沒有非授權的使用者能夠訪問應用。“?”表示匿名使用者,因此我們對所有的匿名使用者設定一個deny標誌。
Login.aspx概述
所有使用者的認證邏輯都在這裡完成。如果想根據Web.config、XML或文字檔、資料庫驗證使用者的認證,那麼驗證工作就是在這裡完成的。下面的例子根據Web.config驗證使用者的認證。
Login.aspx Code
<%@Page Language="VB" %>
<%@Import Namespace="System.Web.Security" %>
<script language="VB" runat="server">
Sub ProcessLogin(objSender As Object, objArgs As EventArgs)
If FormsAuthentication.Authenticate(txtUser.Text, txtPassword.Text) Then
FormsAuthentication.RedirectFromLoginPage(txtUser.Text, chkPersistLogin.Checked)
Else
ErrorMessage.InnerHtml = "<b>Something went wrong...</b> please
re-enter your credentials..."
End If
End Sub
</script>
<html>
<head>
<title>Standard Forms Authentication Login Form</title>
</head>
<body bgcolor="#FFFFFF" text="#000000">
<form runat="server">
<table width="400" border="0" cellspacing="0"
cellpadding="0">
<tr>
<td width="80">Username : </td>
<td width="10"> </td>
<td><asp:TextBox Id="txtUser" width="150" runat="server"/></td>
</tr>
<tr>
<td>Password : </td>
<td width="10"> </td>
<td><asp:TextBox Id="txtPassword" width="150" TextMode="Password"
runat="server"/></td>
</tr>
<tr>
<tr>
<td></td>
<td width="10"> </td>
<td><asp:CheckBox id="chkPersistLogin" runat="server"
/>Remember my credentials
</td>
</tr>
<tr>
<td> </td>
<td width="10"> </td>
<td><asp:Button Id="cmdLogin"
Text="Login" runat="server" /></td>
</tr>
</table>
<div id="ErrorMessage" runat="server" />
</form>
</body>
</html>
Login.aspx的詳細解釋
由於還需要進行認證,因此在上面的代碼中引用了System.Web.Security名字空間,FormsAuthentication是System.Web.Security名字空間中的一個類。在本例中,我們使用了一個帶有分別用來輸入使用者名稱、口令的文字框、口令輸入欄位,還有一個複選框,方便使用者使用一個永久性的cookie集。“Submit”(提交)按鈕有一個onclick事件,它執行一個名為ProcessLogin的子程式。在ProcessLogin內部,我們執行了FormsAuthentication類的Authenticate方法,使用者名稱和口令是其二個參數。這一方法根據使用者名稱和參數檢查Web.config檔案中信任狀的標記。如果它們相符,我們執行RedirectFromLoginPage方法,該方法會向使用者的機器中寫入一個cookie,對使用者的行為進行跟蹤,並確保使用者是經過認證的;如果不相符,就會發生錯誤,並通知使用者。
Default.aspx概述
這是使用者請求或謀略訪問的頁。在本例中,我們將顯示被認證使用者和認證類型。
Default.aspx Code
<%@Page Language="VB" %>
<%@Import Namespace="System.Web.Security" %>
<script language="vb" runat="server">
Sub SignOut(objSender As Object, objArgs As EventArgs)
delete the users auth cookie and sign out
FormsAuthentication.SignOut()
redirect the user to their referring page
Response.Redirect(Request.UrlReferrer.ToString())
End Sub
Sub Page_Load()
verify authentication
If User.Identity.IsAuthenticated Then
display Credential information
displayCredentials.InnerHtml = "Current User : <b>" & User.Identity.Name
& "</b>" & _
"Authentication Used : <b>" & User.Identity.AuthenticationType
& "</b>"
Else
Display Error Message
displayCredentials.InnerHtml = "Sorry, you have not been authenticated."
End If
End Sub
</script>
<html>
<head>
<title>Forms Authentication</title>
</head>
<body bgcolor="#FFFFFF" text="#000000">
<span class="Header">Forms Based Authentication using standard
method</span>
<div id="displayCredentials" runat="server" />
<form runat="server">
<asp:Button id="cmdSignOut" text="Sign Out" runat="server"
/>
</form>
</body>
</html>
由於需要其中的一些方法和屬性,在這裡我再次使用了System.Web.Security名字空間。空間頁中包含一個簡單的div元素,還有一個input元素,它運行一個刪除使用者的cookie的子程式。在Page_Load事件中,我們使用User.Identity.IsAuthenticated屬性檢查使用者是否已經得到了認證,返回的布爾型值表示使用者是否通過了認證。如果使用者通過了認證,我們希望返回使用者的名字和使用的認證方法。使用 User.Identity.Name屬性,我們就能夠得到使用者的名字,Identity.AuthenticationType返回使用的認證方法。我們還使用了一個SignOut過程,允許使用者離開網站,並刪除使用者電腦中的cookie,它甚至能夠刪除一些永久性的cookie。
結束語
通過這篇文章,希望廣大讀者能夠對錶格認證以及如何使用它有一個基本的瞭解,體會到ASP.NET在安全方面對ASP所作的改進。