李 云 唐歆瑜
摘要:采用自定義主體Principal和身份Identity實現(xiàn)基于窗體的安全驗證,構建了一個靈活方便的安全權限管理系統(tǒng),綜合使用了數(shù)據(jù)庫技術、面向對象設計技術、操作系統(tǒng)權限管理、NET框架中基于代碼訪問安全性和基于角色訪問安全性等多方面技術。該方案可以用于多數(shù)WEB系統(tǒng)中,作為通用的安全權限管理模塊。
關鍵詞:身份驗證;自定義主體;自定義身份
中圖法分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)01-10ppp-0c
Securit Authentication Base on .NET
LI YunTANG Xin-yu
(Changsha Aeronautic Vocational and Technical College, Hnnan Changsha 410124, China)
Abstratct: This paper presents an approach for constructing a flexible and convenient Security Management system based on form securit authentication of self-defined principle and identify,combining with database technology,object-oriented design,operating system privilege management,code-based and role-based security access in .NET technology.This new idea can be used in most of Web systems as a universal security privilege management module.
Key words: Identification and Authentication; self-defined principal; self-defined identif
安全認證是一個復雜而關鍵的問題,對于WEB應用程序開發(fā),通常在窗體登陸時實現(xiàn)認證的操作。安全的含義既包括不允許非授權用戶訪問特定資源,也包括允許授權用戶方便地訪問授權資源。驗證是授權的關鍵部分。在允許或拒絕用戶的權限之前,首先必須知道用戶的身份。.NET框架使用身份(identity)和主體(principal)對象代表用戶。主體對象對應于一個用戶,并且包含代表該用戶細節(jié)的身份對象??梢詫⒂脩舴诸悶椴煌慕M或角色(role),如管理員和用戶。
在ASP.NET授權中,有URL、文件、編碼等授權方式,最為靈活的方面是通過編程給用戶授權的能力。本文設計了一種通用的、基于數(shù)據(jù)庫的、可以靈活應用的WEB系統(tǒng)用戶驗證與授權方案。
1 總體設計
.NET 基于角色安全性驗證的核心是主體(Principal)和標識(Identity)對象,其中主體負責角色或者組的驗證,標識對象封裝了有關正在驗證的用戶或實體的信息。角色安全性驗證通過生成可供當前線程使用的主體信息來支持授權,其中主體用關聯(lián)的標識進行構造。驗證用戶后對其進行授權,授權允許細致地定義角色和方法,這些角色可利用這些方法與應用程序的操作或資源進行交互。驗證涉及允許訪問,而授權則精確定義了允許哪些訪問內(nèi)容。
要實現(xiàn)基于Form的身份驗證流程,需要做如下幾項工作:1)修改Web.Config文件;2)在登陸文件(比如login.aspx)中將用戶信息寫入cookies并加密;3)在Global.asax文件的Application_AuthenticateRequest事件中取得用戶身份;4)在需要授權才能訪問的資源頁面檢查用戶授權。

圖1 ASP.NET安全性處理流程
2 數(shù)據(jù)庫設計方案
數(shù)據(jù)庫表設計見圖2,Accounts_PermissionCatego為許可類別表,表示了“橫向”的功能,比如一個網(wǎng)站有多個欄目或多個頻道,就可以劃分多個許可類別。一個用戶可以授予多種角色,一個角色可以包含多個用戶;一個角色可以擁有多種許可;一個許可可以被授予多個角色。通過這樣設計,可以非常靈活的給用戶授權。Accounts_Permissions為許可列表;Accounts_RolePermissions為角色許可表;Accounts_Roles為角色表;Accounts_UserRole為用戶角色表; Accounts_Users為用戶表;

圖2 數(shù)據(jù)庫關系圖
3 業(yè)務邏輯層
SitePrincipal對象是實現(xiàn)了IPrincipal接口的類的實例,這些對象用來表示用戶,并且包括了用戶的身份信息。System.Security.Principal命名空間包括了幾種類型的Principal類,這些類中封裝了程序代碼運行的的安全環(huán)境(security context)。
聲明授權允許在類層次中和單獨的方法、屬性或事件上設置權限需求。通過設置屬性來做到這一點,ASP.NET中內(nèi)置的用戶驗證支持非常強大。它能夠在Context(上下文)對象中自動生成一個名為User的屬性,該屬性允許用戶訪問各種信息,包括用戶是否已經(jīng)驗證、所使用的驗證類型,甚至還有用戶名。.NET系統(tǒng)中的安全機制基于主題(Principal)的概念,Principal對象代表以其名義運行代碼的用戶的安全環(huán)境。低于主體級別的是身份(Identity),身份代表執(zhí)行代碼的用戶。因此每一個主體都有一個身份。主體和身份用戶WEB站點和遠程主機傳遞證書。
由于Microsoft.Net沒有提供一種從數(shù)據(jù)庫獲取許可級別的方式,所以要擴展NET系統(tǒng)中主體和身份的功能。分配給HttpContext.User 的對象必須實現(xiàn)IPrincipal接口,IPrincipal的屬性之一是Identity,而Identity必須實現(xiàn)IIdentity接口,為此設計了兩個類:SiteIdentity和SitePrincipal實現(xiàn)上述接口。類的詳細說明如下:
class SiteIdentity: IIdentity
Name 當前身份名稱
UserId 用戶編號
Password 二進制格式的加密密碼
TestPassword(string) 驗證用戶密碼
Authentication 身份驗證類別,返回”自定義身份驗證”
IsAuthentication 當前身份是否為已經(jīng)驗證
classSitePrincipal: IPrincipal
Identity 獲取當前主體的身份
IsInrole 當前主體是否屬于某個角色
Permissions PermissionsId數(shù)組,許可列表
Roles 主體所屬角色列表
ValidateLogin 驗證登陸電子郵件和密碼
HasPermission 主體是否具有某項許可
EncrptPassword 加密用戶密碼
4 主要技術實現(xiàn)
4.1 Web.Config設置
在配置文件Web.Config中把設置
<authentication mode="Forms" >
<forms
name="edaWebLogin"
path="/"
loginUrl="Accounts/Admin/Login.aspx"
protection="All"
timeout="30">
</forms>
</authentication>
4.2 全局應用程序Global.aspx.cs代碼
public void Application_AuthenticateRequest(Object sender, EventArgs e )
{//嘗試對使用進行身份驗證時激發(fā)
if (HttpContext.Current.User!=null)
if (HttpContext.Current.User.Identity.IsAuthenticated)
if ((HttpContext.Current.User.Identity) is FormsIdentity)
{ FormsIdentity Id = HttpContext.Current.User.Identity;
String useremail = Id.Name.ToString();
SitePrincipal newUser= New SitePrincipal(useremail);
HttpContext.Current.User = newUser;}
}
4.3Accounts/Admin/Login.aspx用戶提交事件
private void Click(Object sender, EventArgs e)
{ SitePrincipal newUser =
_SitePrincipal.ValidateLogin(EmailAddress.Text, Password.Text);
if( newUser = =null)
{LoginResult.Text = "登陸失敗 " && EmailAddress.Text;
LoginResult.Visible = True;}
else
{Context.User = newUser;
FormsAuthentication.SetAuthCookie(EmailAddress.Text, True);
Response.Redirect("Default.aspx");}
}
4.4 驗證用戶身份
//驗證用戶是否具有書籍管理功能
protected void Page_Load ( System.Object sender, System.EventArgs e)
{if (Me.IsPostBack == False)
if (! Context.User.Identity.IsAuthenticated
|| ! ((_SitePrincipal).HasPermission((int)(bookShopPermissions.書店管理)) Context.User, )
Response.Redirect("../../Accounts/Admin/Login.aspx?ShowError=true", True);
……}
}
5 NTFS文件管理及強名稱程序集
ASP.NET中有兩種基本的用戶授權方法:基于角色的方法和基于資源的方法。基于資源的授權是特定于具體的資源,并且特定于底層操作系統(tǒng)或網(wǎng)絡上的用戶或組。在Web內(nèi)容文件上設置受限制的NTFS權限,增強應用程序的安全性。一個網(wǎng)站的多個欄目管理中,其中最重要的、最需要安全保護的模塊無疑是“管理人員”管理模塊。本系統(tǒng)中管理用戶模塊包括如下功能:創(chuàng)建新用戶、刪除用戶、創(chuàng)建角色、刪除角色、創(chuàng)建許可、刪除許可、創(chuàng)建許可類別、刪除許可類別,給角色分配許可,給用戶分配角色等等功能。為了重點保護該模塊功能,該模塊所在文件夾可以通過操作系統(tǒng)NTFS文件管理功能設置權限,由網(wǎng)絡管理員設定只有特定用戶(受信任的)才能訪問該文件夾。
如果在web.config文件中存儲證書,使用MD5或SHA-1哈希實現(xiàn)加密,.NET框架提供的代碼訪問安全性,可以減小惡意代碼或包含錯誤的代碼濫用本系統(tǒng)的代碼的可能性。代碼訪問安全性還有助于最大限度地減少由于代碼中的安全脆弱性而造成的損害。為此使用強名稱對程序集進行簽名。步驟為:
在NET工具命令提示下,使用sn.exe工具創(chuàng)建密鑰對,例如:sn -k myKey.snk,該命令創(chuàng)建了密鑰文件myKey.snk。使用強名稱為程序集簽名,在要簽名的程序集文件AssemblyInfo.cs中添加:
6 結束語
本文采用ASP.NET開發(fā)的WEB應用程序,構建了一個靈活方便的安全權限管理系統(tǒng),綜合使用了數(shù)據(jù)庫技術、面向對象設計技術、操作系統(tǒng)權限管理、NET框架中基于代碼訪問安全性和基于角色訪問安全性等多方面技術,提供了基于Form的應用程序安全驗證。該方案可以用于多數(shù)WEB系統(tǒng)中,作為通用的安全權限管理模塊。
參考文獻:
[1] 麻昌德,易高翔.使用ASP.NET/Web服務實現(xiàn)新聞發(fā)布系統(tǒng)[J].計算機應用與軟件,2004(10):42-43.
[2] Dave Sussman,Alex Homer著,王毅譯.ASP.NET高級編程[M].北京:清華大學出版社,2002.
[3] 花振峰,楊偉民,張生..NET組件和COM組件的應用集合研究[J].電子工程師,2005(2):71-73.
收稿日期:
作者簡介:李云(1973-),女,山東青島人,講師,碩士研究生,研究方向:軟件工程。