ASP.NET應(yīng)用程序的安全方案(一)
發(fā)表時(shí)間:2024-06-16 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]摘要:本文ASP.NET應(yīng)用程序身份驗(yàn)證的概念,介紹了各種身份驗(yàn)證模式并進(jìn)行了比較,闡述了選擇身份驗(yàn)證模式的機(jī)制,并給出了一種基于窗體身份驗(yàn)證模式的實(shí)現(xiàn)方法。關(guān)鍵字:身份驗(yàn)證 authentication ASP.NET WEB應(yīng)用1.身份驗(yàn)證概念 任何成功的應(yīng)用程序安全策略的基礎(chǔ)都是穩(wěn)固的...
摘要:本文ASP.NET應(yīng)用程序身份驗(yàn)證的概念,介紹了各種身份驗(yàn)證模式并進(jìn)行了比較,闡述了選擇身份驗(yàn)證模式的機(jī)制,并給出了一種基于窗體身份驗(yàn)證模式的實(shí)現(xiàn)方法。
關(guān)鍵字:身份驗(yàn)證 authentication ASP.NET WEB應(yīng)用
1.身份驗(yàn)證概念
任何成功的應(yīng)用程序安全策略的基礎(chǔ)都是穩(wěn)固的身份驗(yàn)證和授權(quán)手段,以及提供機(jī)密數(shù)據(jù)的保密性和完整性的安全通訊。
身份驗(yàn)證(authentication)是一個(gè)標(biāo)識(shí)應(yīng)用程序客戶(hù)端的過(guò)程,這里的客戶(hù)端可能包括終端用戶(hù)、服務(wù)、進(jìn)程或計(jì)算機(jī),通過(guò)了身份驗(yàn)證的客戶(hù)端被稱(chēng)為主體(principal)。身份驗(yàn)證可以跨越應(yīng)用程序的多個(gè)層發(fā)生。終端用戶(hù)起初由Web應(yīng)用程序進(jìn)行身份驗(yàn)證,通常根據(jù)用戶(hù)名和密碼進(jìn)行;隨后終端用戶(hù)的請(qǐng)求由中間層應(yīng)用程序服務(wù)器和數(shù)據(jù)庫(kù)服務(wù)器進(jìn)行處理,這過(guò)程中也將進(jìn)行身份驗(yàn)證以便驗(yàn)證并處理這些請(qǐng)求。
圖1列出了各種安全技術(shù)以及每種技術(shù)所提供的主要驗(yàn)證方式。
2. 身份驗(yàn)證模式
如圖1所示,Windows 2000上的.NET框架上提供了以下幾種身份驗(yàn)證:
ASP.NET身份驗(yàn)證模式
Enterprise Services身份驗(yàn)證
SQL Server身份驗(yàn)證
2.1 ASP.NET身份驗(yàn)證模式
ASP.NET身份驗(yàn)證模式包括Windows、Forms(窗體)、Passport(護(hù)照)和None(無(wú))。
2.1.1 Windows身份驗(yàn)證
使用這種身份驗(yàn)證模式時(shí),ASP.NET依賴(lài)于IIS對(duì)用戶(hù)進(jìn)行驗(yàn)證,并創(chuàng)建一個(gè)Windows訪問(wèn)令牌來(lái)表示已通過(guò)驗(yàn)證的標(biāo)識(shí)。IIS提供以下幾種身份驗(yàn)證機(jī)制:
基本身份驗(yàn)證
簡(jiǎn)要身份驗(yàn)證
集成Windows身份驗(yàn)證
證書(shū)身份驗(yàn)證
匿名身份驗(yàn)證
2.1.2 護(hù)照身份驗(yàn)證
使用這種身份驗(yàn)證模式時(shí),ASP.NET使用Microsoft Passport的集中式身份驗(yàn)證服務(wù),ASP.NET為Microsoft Passport軟件開(kāi)發(fā)包(SDK)所提供的功能提供了一個(gè)方便的包裝(Wrapper)。此SDK必須安裝在WEB服務(wù)器上。
2.1.3 窗體身份驗(yàn)證
這種驗(yàn)證方式使用客戶(hù)端重定向功能,將未通過(guò)身份驗(yàn)證的用戶(hù)轉(zhuǎn)發(fā)到特定的登錄窗體,要求用戶(hù)輸入其憑據(jù)信息(通常是用戶(hù)名和密碼)。這些憑據(jù)信息被驗(yàn)證后,系統(tǒng)生成一個(gè)身份驗(yàn)證票證(ticket)并將其返回客戶(hù)端。身份驗(yàn)證票證可在用戶(hù)的會(huì)話期間維護(hù)用戶(hù)的身份標(biāo)識(shí)信息,以及用戶(hù)所屬的角色列表(可選)。
2.1.4 None
使用這種身份驗(yàn)證模式,表示你不希望對(duì)用戶(hù)進(jìn)行驗(yàn)證,或是采用自定義的身份驗(yàn)證協(xié)議。
2.2 Enterprise Services身份驗(yàn)證
Enterprise Services身份驗(yàn)證通過(guò)使用底層的遠(yuǎn)程過(guò)程調(diào)用(RPC,Remote Procedure Call)傳輸結(jié)構(gòu)來(lái)進(jìn)行,而這種結(jié)構(gòu)又使用了操作系統(tǒng)安全服務(wù)提供程序接口(SSPI,Security Service Provider Interface)。可以利用Kerberose或NTLM身份驗(yàn)證機(jī)制對(duì)Enterprise Services應(yīng)用程序的客戶(hù)端進(jìn)行驗(yàn)證。
2.3 SQL Server身份驗(yàn)證
SQL Server可以通過(guò)Windows身份驗(yàn)證機(jī)制(Kerberose或NTLM),也可以通過(guò)其內(nèi)置的身份驗(yàn)證方案-SQL身份驗(yàn)證機(jī)制進(jìn)行驗(yàn)證。通常有兩種可用的驗(yàn)證方案。
2.3.1 SQL Server and Windows
客戶(hù)端可用通過(guò)SQL Server身份驗(yàn)證或Windows身份驗(yàn)證機(jī)制來(lái)連接SQL Server的某個(gè)實(shí)例。這種方式有時(shí)也被稱(chēng)為混合模式的身份驗(yàn)證。
2.3.2 Windows Only
客戶(hù)端必須通過(guò)使用Windows身份驗(yàn)證機(jī)制來(lái)連接到SQL Server的一個(gè)實(shí)例。
3. 選擇身份驗(yàn)證機(jī)制
設(shè)計(jì)分布式應(yīng)用程序的身份驗(yàn)證是一項(xiàng)具有挑戰(zhàn)性的任務(wù)。在應(yīng)用程序開(kāi)發(fā)的早期階段,進(jìn)行適當(dāng)?shù)纳矸蒡?yàn)證設(shè)計(jì)有助于降低許多安全風(fēng)險(xiǎn)。
3.1 各種身份驗(yàn)證機(jī)制的比較
用戶(hù)是否需要在服務(wù)器域中擁有Windows帳戶(hù) 是否支持委托 是否需要Windows 2000客戶(hù)端和服務(wù)器 憑據(jù)是否明文傳輸(需要SSL) 是否支持非IE瀏覽器
基本身份驗(yàn)證 是 是 否 是 是
簡(jiǎn)要身份驗(yàn)證 是 否 是 否 否
NTLM身份驗(yàn)證 是 否 否 否 否
Kerberos身份驗(yàn)證 是 是 是 否 否
證書(shū)身份驗(yàn)證 否 是 否 否 是
窗體身份驗(yàn)證 否 是 否 是 是
護(hù)照身份驗(yàn)證 否 是 否 否 是
3.2 選擇身份驗(yàn)證機(jī)制需要考慮的因素
標(biāo)識(shí) 只有當(dāng)應(yīng)用程序的用戶(hù)具有的Windows帳戶(hù)可以通過(guò)一個(gè)受信任的權(quán)威機(jī)構(gòu)(它可以被應(yīng)用程序Web服務(wù)器訪問(wèn))來(lái)進(jìn)行驗(yàn)證時(shí),使用Windows身份驗(yàn)證機(jī)制才是合適的。
憑據(jù)管理 Windows身份驗(yàn)證的一個(gè)關(guān)鍵優(yōu)勢(shì)在于它可以使用操作系統(tǒng)進(jìn)行憑據(jù)管理。當(dāng)使用非Windows身份驗(yàn)證方式,例如窗體身份驗(yàn)證時(shí),必須仔細(xì)考慮在何處以及如何保存用戶(hù)憑據(jù)。其中最常用的方式是使用SQL Server數(shù)據(jù)庫(kù)或是使用位于Active Directory中的User對(duì)象。
標(biāo)識(shí)流動(dòng) 是否需要實(shí)現(xiàn)一個(gè)模擬/委托模型,并將原始調(diào)用者的安全上下文在操作系統(tǒng)級(jí)進(jìn)行跨層流動(dòng)-例如,以便支持審核或針對(duì)每個(gè)用戶(hù)的精細(xì)授權(quán)。
瀏覽器類(lèi)型 應(yīng)用程序的所有用戶(hù)是否都擁有IE瀏覽器?或是你是否需要支持一個(gè)具有混合型瀏覽器的用戶(hù)群? 我們選擇身份驗(yàn)證時(shí)需要根據(jù)各種方式的特點(diǎn),綜合考慮以上因素。
3.3 Intranet系統(tǒng)的選擇決策流程
參見(jiàn)圖2。
3.4 SQL Server用戶(hù)驗(yàn)證
對(duì)SQL Server的客戶(hù)端進(jìn)行驗(yàn)證,一般說(shuō)來(lái)Windows身份驗(yàn)證要比SQL Server身份驗(yàn)證更安全,原因主要有以下幾點(diǎn):
前者負(fù)責(zé)管理用戶(hù)的憑據(jù)信息,而且用戶(hù)的憑據(jù)不會(huì)在網(wǎng)絡(luò)上傳輸。
可以避免在連接字符串中嵌入用戶(hù)名和密碼。
可通過(guò)密碼過(guò)期時(shí)限、最小密碼長(zhǎng)度、以及多次無(wú)效登錄后請(qǐng)求的帳戶(hù)鎖定等措施改進(jìn)登錄安全性。這樣可以見(jiàn)少詞典攻擊的威脅。
但是某些特定的應(yīng)用程序方案中不允許使用Windows身份驗(yàn)證,例如:
數(shù)據(jù)庫(kù)客戶(hù)端和數(shù)據(jù)庫(kù)服務(wù)器由一個(gè)防火墻分隔開(kāi),從而導(dǎo)致無(wú)法使用Windows身份驗(yàn)證。
應(yīng)用程序需要使用多個(gè)標(biāo)識(shí)連接到一個(gè)或多個(gè)數(shù)據(jù)庫(kù)。
連接到的數(shù)據(jù)庫(kù)不是SQL Server。
在ASP.NET中沒(méi)有一種安全的方式以特定的Windows用戶(hù)的身份運(yùn)行代碼。
在以上這些方案中,將必須使用SQL身份驗(yàn)證,或是數(shù)據(jù)庫(kù)的本機(jī)身份驗(yàn)證機(jī)制。
4. ASP.NET身份驗(yàn)證實(shí)現(xiàn)
4.1 方案特性
在這部分,僅提供了一種Intranet下交互式WEB應(yīng)用程序的身份驗(yàn)證的實(shí)現(xiàn),本方案假設(shè)具有以下特性:
只有通過(guò)了身份驗(yàn)證的客戶(hù)端才能訪問(wèn)應(yīng)用程序。
數(shù)據(jù)庫(kù)相信應(yīng)用程序?qū)τ脩?hù)進(jìn)行了相應(yīng)的身份驗(yàn)證-即應(yīng)用程序代表用戶(hù)對(duì)數(shù)據(jù)庫(kù)進(jìn)行調(diào)用。
WEB應(yīng)用程序通過(guò)使用ASP.NET進(jìn)程帳戶(hù)連接到數(shù)據(jù)庫(kù)。
用戶(hù)的憑據(jù)信息是根據(jù)SQL Server數(shù)據(jù)庫(kù)進(jìn)行驗(yàn)證的。
使用窗體身份驗(yàn)證模式。
在WEB應(yīng)用程序中,用戶(hù)的憑據(jù)信息是根據(jù)SQL Server數(shù)據(jù)庫(kù),采用窗體身份驗(yàn)證模式,便于實(shí)現(xiàn)用戶(hù)個(gè)性化設(shè)計(jì)。采用應(yīng)用程序代表用戶(hù)對(duì)數(shù)據(jù)庫(kù)進(jìn)行調(diào)用的方式,可采用受信任子系統(tǒng)模型,更好地利用數(shù)據(jù)庫(kù)連接池,并且可以保證用戶(hù)不能直接訪問(wèn)后端數(shù)據(jù)庫(kù),另外可以減少后端的ACL管理工作。
4.2 安全配置步驟
4.2.1 IIS配置步驟
對(duì)Web服務(wù)的虛擬根目錄啟用匿名訪問(wèn)。
主要方法是使用IIS MMC管理單元,右擊應(yīng)用程序的虛擬目錄,然后單擊屬性---〉目錄安全性--〉匿名訪問(wèn)和安全控制--〉編輯。
4.2.2 ASP.NET配置步驟
1. 將ASPNET帳戶(hù)(用于運(yùn)行ASP.NET)的密碼重新設(shè)置為一個(gè)更安全的密碼。
這樣允許在數(shù)據(jù)庫(kù)服務(wù)器上復(fù)制一個(gè)本地帳戶(hù)(具有相同的用戶(hù)名和密碼)。為了使用Windows身份驗(yàn)證連接到數(shù)據(jù)庫(kù)時(shí),能夠使ASPNET帳戶(hù)對(duì)來(lái)自數(shù)據(jù)庫(kù)的網(wǎng)絡(luò)身份驗(yàn)證要求進(jìn)行響應(yīng),這是必須的。
具體方法是編輯位于%windr%\Microsoft.NET\Framework\v1.1.4322\CONFIG目錄下的Machine.config文件,將<processModel>元素上的密碼屬性重新配置,將其默認(rèn)值<!-UserName="machine" password="AutoGenerate" -->改為<!-UserName="machine" password="NewPassword" -->。
2. 配置ASP.NET,使用窗體身份驗(yàn)證。
編輯位于WEB服務(wù)的虛擬根目錄下的Web.config文件,將<authentication>元素設(shè)置為:
<authentication mode="Forms" >
<forms name="MyAppFormAuth" loginUrl="login.aspx" protection="All" timeout="20" path="/">
</forms>
</authentication>
4.2.3 配置SQL Server
1. 在SQL Server數(shù)據(jù)庫(kù)上創(chuàng)建一個(gè)和ASP.NET進(jìn)程帳戶(hù)匹配的Windows帳戶(hù)。
用戶(hù)名和密碼必須和ASP.NET應(yīng)用程序帳號(hào)匹配。
2. 配置SQL Server,使其使用Windows身份驗(yàn)證。
3. 為自定義的ASP.NET應(yīng)用程序帳戶(hù)創(chuàng)建一個(gè)SQL Server登錄,授予對(duì)SQL Server的訪問(wèn)權(quán)。
4. 創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)用戶(hù),并將登錄名映射為數(shù)據(jù)庫(kù)用戶(hù)。
5. 創(chuàng)建一個(gè)用戶(hù)定義的新數(shù)據(jù)庫(kù)角色,并將數(shù)據(jù)庫(kù)用戶(hù)添加到該角色。
6. 為數(shù)據(jù)庫(kù)角色確定數(shù)據(jù)庫(kù)權(quán)限。
4.3 程序代碼
4.3.1 身份驗(yàn)證事件序列
當(dāng)未通過(guò)身份驗(yàn)證的用戶(hù)試圖放一個(gè)受保護(hù)的文件或資源被拒絕時(shí),觸發(fā)的事件序列如圖3所示。
4.3.2 代碼實(shí)現(xiàn)步驟
1. 建一個(gè)WEB登錄窗體并驗(yàn)證用戶(hù)提供的憑據(jù)信息
根據(jù)SQL Server數(shù)據(jù)庫(kù)來(lái)驗(yàn)證憑據(jù)信息。
2. 從數(shù)據(jù)庫(kù)里獲取角色列表
3. 創(chuàng)建窗體身份驗(yàn)證票證
在票證中保存所獲取的角色信息。示例代碼如下:
private void btnLogin_Click(object sender, System.EventArgs e)
{
//根據(jù)SQL Server數(shù)據(jù)庫(kù)進(jìn)行驗(yàn)證(具體實(shí)現(xiàn)略)。
bool isAuthenticated = IsAuthenticated( txtUserName.Text, txtPassword.Text );
if (isAuthenticated == true )
{
//獲取用戶(hù)的角色
string roles = GetRoles( txtUserName.Text, txtPassword.Text );
// 創(chuàng)建身份驗(yàn)證票證
FormsAuthenticationTicket authTicket = new
FormsAuthenticationTicket(1, // version
txtUserName.Text, // user name
DateTime.Now, // creation
DateTime.Now.AddMinutes(60),// Expiration
false, // Persistent
roles ); // User data
string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
// 創(chuàng)建Cookie
HttpCookie authCookie =
new HttpCookie(FormsAuthentication.FormsCookieName,
encryptedTicket);
Response.Cookies.Add(authCookie);
// 將用戶(hù)重定向到最初請(qǐng)求頁(yè)面。
Response.Redirect( FormsAuthentication.GetRedirectUrl(
txtUserName.Text,
false ));
}
}
4. 創(chuàng)建IPrincipal對(duì)象 可在Application_AuthenticateRequest事件中創(chuàng)建一個(gè)IPrincipal對(duì)象,一般使用GenericPrincipal類(lèi)。
5. 將IPrincipal對(duì)象置于當(dāng)前的HTTP上下文
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
// 提去窗體身份驗(yàn)證cookie
string cookieName = FormsAuthentication.FormsCookieName;
HttpCookie authCookie = Context.Request.Cookies[cookieName];
if(null == authCookie)
{
return;
}
FormsAuthenticationTicket authTicket = null;
try
{
authTicket = FormsAuthentication.Decrypt(authCookie.Value);
}
catch(Exception ex)
{
return;
}
if (null == authTicket)
{
return;
}
//提取角色
string[] roles = authTicket.UserData.Split(new char[]{' '});
// 創(chuàng)建Identity object
FormsIdentity id = new FormsIdentity( authTicket );
GenericPrincipal principal = new GenericPrincipal(id, roles);
Context.User = principal;
}
具體的代碼讀者可以自行補(bǔ)充完成。
5. 后記
與授權(quán)與安全通訊有關(guān)的內(nèi)容將