ASP.NET應用程式的安全方案(一)—身分識別驗證 __.net

來源:互聯網
上載者:User

摘要:本文ASP.NET應用程式身分識別驗證的概念,介紹了各種身分識別驗證模式並進行了比較,闡述了選擇身分識別驗證模式的機制,並給出了一種基於表單身分識別驗證模式的實現方法。


關鍵字:身分識別驗證 authentication ASP.NET WEB應用
1.身分識別驗證概念     任何成功的應用程式安全性原則的基礎都是穩固的身分識別驗證和授權手段,以及提供機密資料的保密性和完整性的安全通訊。
    身分識別驗證(authentication)是一個標識應用程式用戶端的過程,這裡的用戶端可能包括終端使用者、服務、進程或電腦,通過了身分識別驗證的用戶端被稱為主體(principal)。身分識別驗證可以跨越應用程式的多個層發生。終端使用者起初由Web應用程式進行身分識別驗證,通常根據使用者名稱和密碼進行;隨後終端使用者的請求由中介層應用程式伺服器和資料庫伺服器進行處理,這過程中也將進行身分識別驗證以便驗證並處理這些請求。
    圖1列出了各種安全技術以及每種技術所提供的主要驗證方式。
2. 身分識別驗證模式     如圖1所示,Windows 2000上的.NET架構上提供了以下幾種身分識別驗證:
ASP.NET身分識別驗證模式 Enterprise Services身分識別驗證 SQL Server身分識別驗證 2.1 ASP.NET身分識別驗證模式     ASP.NET身分識別驗證模式包括Windows、Forms(表單)、Passport(護照)和None(無)。
2.1.1 Windows身分識別驗證     使用這種身分識別驗證模式時,ASP.NET依賴於IIS對使用者進行驗證,並建立一個Windows存取權杖來表示已通過驗證的標識。IIS提供以下幾種身分識別驗證機制:
基本驗證 簡要身分識別驗證 整合Windows身分識別驗證 憑證驗證 匿名驗證 2.1.2 護照身分識別驗證     使用這種身分識別驗證模式時,ASP.NET使用Microsoft Passport的集中式驗證服務,ASP.NET為Microsoft Passport軟體開發包(SDK)所提供的功能提供了一個方便的封裝(Wrapper)。此SDK必須安裝在WEB伺服器上。
2.1.3 表單身分識別驗證     這種驗證方式使用用戶端重新導向功能,將未通過身分識別驗證的使用者轉寄到特定的登入表單,要求使用者輸入其憑據資訊(通常是使用者名稱和密碼)。這些憑據資訊被驗證後,系統產生一個身分識別驗證票證(ticket)並將其返回用戶端。身分識別驗證票證可在使用者的會話期間維護使用者的身份標識資訊,以及使用者所屬的角色列表(可選)。
2.1.4 None     使用這種身分識別驗證模式,表示你不希望對使用者進行驗證,或是採用自訂的身分識別驗證協議。
2.2 Enterprise Services身分識別驗證      Enterprise Services身分識別驗證通過使用底層的遠端程序呼叫(RPC,Remote Procedure Call)傳輸結構來進行,而這種結構又使用了作業系統安全服務提供者介面(SSPI,Security Service Provider Interface)。可以利用Kerberose或NTLM身分識別驗證機制對Enterprise Services應用程式的用戶端進行驗證。
2.3 SQL Server身分識別驗證     SQL Server可以通過Windows身分識別驗證機制(Kerberose或NTLM),也可以通過其內建的身分識別驗證方案-SQL身分識別驗證機制進行驗證。通常有兩種可用的驗證方案。
2.3.1 SQL Server and Windows     用戶端可用通過SQL Server身分識別驗證或Windows身分識別驗證機制來串連SQL Server的某個執行個體。這種方式有時也被稱為混合模式的身分識別驗證。
2.3.2 Windows Only     用戶端必須通過使用Windows身分識別驗證機制來串連到SQL Server的一個執行個體。
3. 選擇身分識別驗證機制     設計分布式應用程式的身分識別驗證是一項具有挑戰性的任務。在應用程式開發的早期階段,進行適當的身分識別驗證設計有助於降低許多安全風險。 3.1 各種身分識別驗證機制的比較   使用者是否需要在伺服器域中擁有Windows帳戶 是否支援委託 是否需要Windows 2000用戶端和伺服器 憑據是否明文傳輸(需要SSL) 是否支援非IE瀏覽器 基本驗證 是 是 否 是 是 簡要身分識別驗證 是 否 是 否 否 NTLM身分識別驗證 是 否 否 否 否 Kerberos身分識別驗證 是 是 是 否 否 憑證驗證 否 是 否 否 是 表單身分識別驗證 否 是 否 是 是 護照身分識別驗證 否 是 否 否 是 3.2 選擇身分識別驗證機制需要考慮的因素      標識 只有當應用程式的使用者具有的Windows帳戶可以通過一個受信任的權威機構(它可以被應用程式Web伺服器訪問)來進行驗證時,使用Windows身分識別驗證機制才是合適的。
     憑據管理 Windows身分識別驗證的一個關鍵優勢在於它可以使用作業系統進行憑據管理。當使用非Windows身分識別驗證方式,例如表單身分識別驗證時,必須仔細考慮在何處以及如何儲存使用者憑證。其中最常用的方式是使用SQL Server資料庫或是使用位於Active Directory中的User對象。
     標識流動 是否需要實現一個類比/委託模型,並將原始調用者的安全上下文在作業系統級進行跨層流動-例如,以便支援審核或針對每個使用者的精細授權。
     瀏覽器類型 應用程式的所有使用者是否都擁有IE瀏覽器。或是你是否需要支援一個具有混合型瀏覽器的使用者群。 我們選擇身分識別驗證時需要根據各種方式的特點,綜合考慮以上因素。
3.3 Intranet系統的選擇決策流程     參見圖2。
3.4 SQL Server使用者驗證     對SQL Server的用戶端進行驗證,一般說來Windows身分識別驗證要比SQL Server身分識別驗證更安全,原因主要有以下幾點: 前者負責系統管理使用者的憑據資訊,而且使用者的憑據不會在網路上傳輸。 可以避免在連接字串中嵌入使用者名稱和密碼。 可通過密碼到期時限、最小密碼長度、以及多次無效登入後請求的帳戶鎖定等措施改進登入安全性。這樣可以見少詞典攻擊的威脅。     但是某些特定的應用程式方案中不允許使用Windows身分識別驗證,例如: 資料庫用戶端和資料庫伺服器由一個防火牆分隔開,從而導致無法使用Windows身分識別驗證。 應用程式需要使用多個標識串連到一個或多個資料庫。 串連到的資料庫不是SQL Server。 在ASP.NET中沒有一種安全的方式以特定的Windows使用者的身份運行代碼。     在以上這些方案中,將必須使用SQL身分識別驗證,或是資料庫的本機身分識別驗證機制。
4. ASP.NET身分識別驗證實現 4.1 方案特性 在這部分,僅提供了一種Intranet下互動式WEB應用程式的身分識別驗證的實現,本方案假設具有以下特性: 只有通過了身分識別驗證的用戶端才能訪問應用程式。 資料庫相信應用程式對使用者進行了相應的身分識別驗證-即應用程式代表使用者對資料庫進行調用。 WEB應用程式通過使用ASP.NET進程帳戶串連到資料庫。 使用者的憑據資訊是根據SQL Server資料庫進行驗證的。 使用表單身分識別驗證模式。     在WEB應用程式中,使用者的憑據資訊是根據SQL Server資料庫,採用表單身分識別驗證模式,便於實現使用者個人化設計。採用應用程式代表使用者對資料庫進行調用的方式,可採用受信任子系統模型,更好地利用資料庫連接池,並且可以保證使用者不能直接存取後端資料庫,另外可以減少後端的ACL管理工作。
4.2 安全配置步驟 4.2.1 IIS配置步驟     對Web服務的虛擬根目錄啟用匿名訪問。
    主要方法是使用IIS MMC嵌入式管理單元,右擊應用程式的虛擬目錄,然後單擊屬性---〉目錄安全性--〉匿名訪問和安全控制--〉編輯。
4.2.2 ASP.NET配置步驟     1. 將ASPNET帳戶(用於運行ASP.NET)的密碼重新設定為一個更安全的密碼。
    這樣允許在資料庫伺服器上複製一個本地帳戶(具有相同的使用者名稱和密碼)。為了使用Windows身分識別驗證串連到資料庫時,能夠使ASPNET帳戶對來自資料庫的網路身分識別驗證要求進行響應,這是必須的。
    具體方法是編輯位於%windr%/Microsoft.NET/Framework/v1.1.4322/CONFIG目錄下的Machine.config檔案,將<processModel>元素上的密碼屬性重新設定,將其預設值<!-UserName="machine" password="AutoGenerate" -->改為<!-UserName="machine" password="NewPassword" -->。
    2. 配置ASP.NET,使用表單身分識別驗證。
    編輯位於WEB服務的虛擬根目錄下的Web.config檔案,將<authentication>元素設定為:
<authentication mode="Forms" >
<forms name="MyAppFormAuth" loginUrl="login.aspx" protection="All" timeout="20" path="/">
</forms>
</authentication>
4.2.3 配置SQL Server      1. 在SQL Server資料庫上建立一個和ASP.NET進程帳戶匹配的Windows帳戶。
使用者名稱和密碼必須和ASP.NET應用程式帳號匹配。
     2. 配置SQL Server,使其使用Windows身分識別驗證。
     3. 為自訂的ASP.NET應用程式帳戶建立一個SQL Server登入,授予對SQL Server的訪問權。
     4. 建立一個新的資料庫使用者,並將登入名稱映射為資料庫使用者。
     5. 建立一個使用者定義的新資料庫角色,並將資料庫使用者添加到該角色。
     6. 為資料庫角色確定資料庫許可權。
4.3 程式碼 4.3.1 身分識別驗證事件序列     當未通過身分識別驗證的使用者試圖放一個受保護的檔案或資源被拒絕時,觸發的事件序列如圖3所示。
4.3.2 代碼實現步驟     1. 建一個WEB登入表單並驗證使用者提供的憑據資訊
     根據SQL Server資料庫來驗證憑據資訊。
     2. 從資料庫裡擷取角色列表
     3. 建立表單身分識別驗證票證
     在票證中儲存所擷取的角色資訊。範例程式碼如下:
private void btnLogin_Click(object sender, System.EventArgs e)
{
//根據SQL Server資料庫進行驗證(具體實現略)。
bool isAuthenticated = IsAuthenticated( txtUserName.Text, txtPassword.Text );
if (isAuthenticated == true )
{
//擷取使用者的角色
string roles = GetRoles( txtUserName.Text, txtPassword.Text );

 

// 建立身分識別驗證票證
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);
// 建立Cookie
HttpCookie authCookie =
new HttpCookie(FormsAuthentication.FormsCookieName,
encryptedTicket);

Response.Cookies.Add(authCookie);

// 將使用者重新導向到最初請求頁面。
Response.Redirect( FormsAuthentication.GetRedirectUrl(
txtUserName.Text,
false ));
}
}     4. 建立IPrincipal對象     可在Application_AuthenticateRequest事件中建立一個IPrincipal對象,一般使用GenericPrincipal類。
     5. 將IPrincipal對象置於當前的HTTP上下文

 

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
// 提去表單身分識別驗證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[]{'|'});

// 建立Identity object
FormsIdentity id = new FormsIdentity( authTicket );

GenericPrincipal principal = new GenericPrincipal(id, roles);
Context.User = principal;
}     具體的代碼讀者可以自行補充完成。
5. 後記 與授權與安全通訊有關的內容將另外論述。


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=29141  

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.