安全
.NET平台及其ASP+所提供的強大開發功能是每個程式員所不能忽視的,對某種語言的偏好不該影響選擇最具效率的開發工具。而目前,ASP+確實提供了許多JSP所無法比擬的功能。
使用ASP+,你會真正感到使用語言的自由性,編程時在網頁上可看到編譯ASP+頁中C#等語言時的全部編譯資訊,而且使用ASP+提供的數十種功能強大的伺服器端控制項,幾乎可
以實現以前用戶端RAD開發工具所能實現的全部功能,ASP+可以直接方便地使用.NET中的XML技術,使用幾個簡單的函數就可以用XML替代一些資料庫或和其他程式交換資訊。
對於未來,將有越來越多的語言支援ASP+的開發,而富士通美國子公司已經推出了Cobol for .NET,讓Cobol也可以開發ASP+應用程式了。惟一遺憾的是,ASP+目前還不能跑在除Windows系列的其他平台上,但這正是.NET正在做的事。
基於上述優點,越來越多的Web應用將會使用ASP+方式開發,在具體實現如電子商務等應用時,必須重視各種安全性問題,此問題涉及作業系統、網路管理及程式安全等眾多方面,限於篇幅,本文將介紹如何用ASP+的配置和程式實現安全身分識別驗證。
ASP+的相關配置
ASP+的配置方法較特別,它使用config.web這個XML類型的檔案來儲存配置資訊,你可用notepad或XML編輯器方便地修改其內容,規定的設定方式是子目錄繼承或者覆蓋從父目錄得來的配置設定,就是說在root目錄下放了個config.web檔案,那麼任何下一級目錄將自動繼承這個檔案中的配置,假如某個子目錄需要另外的配置時,我們可再另建一個config.web放在該子目錄下。這種組態管理方式對安裝你的應用程式、配置的修改及安全管理都極為有利。
ASP+提供了三種主要的身分識別驗證方式即:Windows、Cookie和Passport,Windows是指使用Windows自身的安全管理方式,你可通過設定Windows的使用者及IIS等許可權來保障安全,對於一些大應用,使用此方法將非常複雜和煩瑣。Passport方式較為方便和安全,使用者只用一個使用者名稱和密碼可以訪問任何成員站,並且在登出離開時,所有Passport相關的資訊都會清除,你可以在公用場所放心地使用它,相信Passport比較適合Internet的應用。在企業級應用中,使用Cookie方式和SSL、IP限制等一些網管技術同樣可以實現一定的安全性。
下面介紹一下Cookie的配置:
你需建一個如下內容的config.web,並將它放在C:inetpubwwwroot(IIS預設目錄)下,對於系統安裝時已經建立的config.web,一般在WINNTMicrosoft.NETFrameworkv...目錄下。
<configuration>
<security>
<authentication mode="Cookie">
<cookie decryptionkey="autogenerate" loginurl="/login.aspx" cookie=".ASPXAUTH" />
</authentication>
<authorization>
<deny users="?" />
</authorization>
</security>
</configuration>
該設定檔聲明用Cookie方式驗證,在你訪問該目錄及其子目錄下的aspx檔案時,如果你沒有認證的Cookie,它就會重新導向到login.aspx。如果你需要一個不需要身份認證的目錄(可放使用者申請的程式)則可建一個如下的config.web並放在該目錄下:
<configuration>
<security>
<authorization>
<allow users="*" />
</authorization>
</security>
</configuration>
程式設計
你需在root目錄下建立Default.aspx和login.aspx這兩個ASP+程式。
login.aspx程式內容如下:
<%@ Import Namespace="System.Web.Security" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.ADO" %>
<html>
<head>
<title>Login</title>
<script language="C#" runat=server Debug="true">
void Login_Click(Object sender, EventArgs e) {
if(Page.IsValid)
{ ADODataReader dr;
//串連資料庫,使用者名稱和密碼放在ODBC串連的資料庫QCDB中的表Users中
ADOConnection cn = new ADOConnection("DSN=QCDB");
cn.Open();
ADOCommand cmdQuestion = new ADOCommand("SELECT Password FROM Usersswheresname = '" + YourName.Text + "'", cn);
//選擇相應使用者資訊
cmdQuestion.Execute(out dr);
//建一個datareader得到SQL結果
if(dr.Read()) //得到對應的第一個行資料
if(dr["Password"].ToString() == Password.Text)
CookieAuthentication.RedirectFromLoginPage(YourName.Text, AbidingCookie.Checked);
else //上面語句產生一個Cookie,如使用者選擇AbidingCookie,則永久儲存Cookie
Msg.Text = "密碼錯誤";
else
Msg.Text = "使用者名稱不存在";
}
}
</script>
</head><center><body>
<ASP:Label id="Msg" ForeColor="red" Font-Name="Verdana";
Font-Size="18" runat=server />
<form runat=server>
<table><tr><td><ASP:label text="使用者名稱: " runat=server/></td>
<td><ASP:textbox id="YourName" runat=server /></td>
</tr><tr><td><ASP:label text="密碼:" runat=server/></td>
<td><ASP:textbox id="Password" TextMode="Password" runat=server /></td>
<td><ASP:button id="btnLogin" Text="確定" runat=Server /></td>
<td></td></tr><tr><td>希望下次不用輸入密碼</td>
<td><ASP:CheckBox id=AbidingCookie runat="server" /></td>
<td></td></tr></td><td></td></tr></table>
</form></td><td width="283" height="1" bgcolor="#F0F0F0"></td>
</tr></table></center></div><p></p></body>
</html>
Default.aspx程式內容如下:
<%@ Page LANGUAGE="c#" %>
<html><head><title>歡迎來到.NET的世界</title>
<script runat=server>
private void Page_Load(Object Src, EventArgs E )
{ Welcome.InnerHtml = "祝賀你通過身分識別驗證" + Context.User.Identity.Name;
} private void Signout_Click(Object sender, EventArgs E)
{ CookieAuthentication.SignOut();
//按下SignOut按鍵清除原Cookie
Response.Redirect("login.aspx");
//讓使用者重輸入新使用者名稱、密碼
}
</script><body><center>
<h3><font face="Verdana">.NET身分識別驗證系統提示你</font></h3>
<span id="Welcome" runat=server/><form runat=server>
<input type="submit" OnServerClick= "Signout_Click" Value="取消該登入身份" runat="server"/><p>
</form><p><a href="/adduser/">進入管理室</a></p></center></body></html>
具體執行時,當一個未經認證的使用者瀏覽你的網站的.aspx檔案時(注意,Cookie認證只對.aspx檔案起作用),系統發現該使用者沒Cookie,於是將它重新導向到login.aspx,當使用者輸入正確的使用者名稱和密碼後,系統為該使用者產生一個Cookie並立刻自動重新導向到一開始該使用者要瀏覽的.aspx檔案並執行它,預設的則定向到Default.aspx,上面提供的Default.aspx則提示你已經通過身份認證。
總結
由於我們使用了Session跟蹤應用程式訪問或會話期間特定的Web瀏覽器資訊,帶有相應的cookie的HTTP請求被認為是來自同一Web瀏覽器,所以要防止被人使用Sniffer等方法非法截獲Cookie資訊,你需要考慮使用SSL或其他安全的通訊鏈路加密方法。
對於上述程式,你可以方便地在Table中加入使用者IP地址的資訊,來驗證Intranet使用者。由於Cookie就像一個身份證,為防止有人非法使用你的Cookie,應該讓Cookie隨著瀏覽器的關閉一起清除。
總之,使用Cookie的驗證方法再結合各種加密手段以及作業系統完善的安全配置就可以為大多數需要安全認證的應用提供足夠的支援。