熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

利用ASP.NET訪問共享網絡資源

2013-11-13 10:30:57  來源: .NET編程 

  對於許多ASPNET開發人員而言共享資源的訪問是一個重大挑戰當開發Web表單和Web服務時就會遇到這樣的挑戰微軟公司的NET擁有全新的用戶授權和認證措施大多數與安全相關的文章和書籍都用相當的篇幅解釋表單認證但是與IIS網絡和操作系統安全相結合來理解ASPNET安全架構是提供最佳解決方案的關健
  
 

  
(圖

  
  圖描述了由IIS和ASPNET提供的基本安全表示它與ASP安全相比有根本不同上面的圖來自MSDN的網站當有Web請求發生時下面的事件會依次發生
  
  用戶發出HTTP請求
  
  當Web請求發生時它會由以SYSTEM帳戶運行的IIS獲得SYSTEM帳戶的功能非常強大而且擁有所有類型的權限IIS根據選擇的認證類型進行認證並為每名經過認證的用戶創建一個訪問令牌如果選擇了了匿名認證它就會為該匿名用戶創建一個訪問令牌缺省情況下是IUSR_MACHINE另外ISS還根據配置的授權類型進行認證例如IIS能夠配置得只接受來自特定IP地址的請求
  
  IIS將請求和被認證用戶的Windows訪問令牌傳遞給aspnet_isepidll這是一個注冊為處理aspx URL的ISAPI擴展Aspnet_isepidll是一個IIS模塊是IIS和ASPNET運行時間環境之間的一座橋Aspnet_isapi通過命名管道向工作者進程轉發該請求
  
  該工作者進程是托管著CLR的aspnet_wpexe缺省情況下工作者進程以ASPNET帳戶運行當安裝ASPNET框架時系統會創建該本地帳戶與功能強大的SYSTEM帳戶不同的是ASPNET帳戶的功能十分有限ASPNET根據其認證配置對請求者進行認證認證以XML格式配置在該項目的nfig文件中如果ASPNET被配置為Windows認證它會接受任何來自IIS的令牌而不會進行其它認證另外ASPNET還授權對請求的資源和文件的訪問例如FileAuthorizationModel可以用來檢查用戶是否具有訪問請求的資源所需要的權限對於Windows認證而言用戶的訪問令牌為ACL
  
  如果整個過程發展到了這一步應用軟件就會使用特定的身份訪問資源缺省情況下ASPNET進程帳戶提供這一身份但是如果允許模仿可以使用用戶原來的身份或對模仿進行配置使應用程序能夠以特定的身份運行
  
  既然安全措施已經闡明在假設NTFC的權限被設置為網絡資源的情況下用戶就可以訪問數據了在進一步向前發展之前有二個重要問題需要解決一個是指定和定義訪問UNC共享上文件和文件夾的任務換句話說也就是訪問網絡上共享的文件和文件夾另一個問題是決定用來完成資源訪問任務的身份為了完成第一個任務需要首先完成第二個任務
  
  有幾種方法可以用來訪問網絡資源
  
  使用ASPNET進程身份
  
  使用匿名用戶帳戶
  
  使用LogonUser API
  
  使用服務性的組件(企業服務)
  
  使用ASPNET進程身份似乎有很明顯的缺陷缺省情況下當應用程序試著訪問資源時ASPNET進程身份提供一個身份(ASPNET)最簡單的解決方案是創建一個具有與遠程計算機上相匹配的用戶名和密碼的本地帳戶大多數企業都會有龐大的內聯網因此這一方法是不切實際的另外知道是誰在訪問資源也是非常重要的盡管該方法足以訪問網絡資源但效率不夠高第二個方法是使用匿名帳戶例如IUSR_MACHINE與上面的原因相同這種方法的效率顯然也不高第三種方法是使用LogonUser API這種方法要求通過調用Win LogonUser API模仿一個特定的身份還可以通過配置ASPNET項目nfig文件中的<identity>元素進行模仿據MSDN上的一篇文章稱不建議用戶使用以上這些方法應當避免在Windows 服務器上使用它們因為它們要求向ASPNET帳戶進程授予作為操作系統一部分運行的權限從而極大地降低了web應用程序的安全性因此該方法也不理想最後也是最可行的解決該問題的方法是使用配置為作為用於訪問網絡資源固定身份運行的服務性組件這種方法聽起來令人膽怯但它是目前最好的解決方案它的架構如下圖所示
  
 

  
(圖

  
  梅耶在?url=/library/enus/dnnetsec/html/SecNetchasp上發表的一一篇有關安全的文章中表示在企業服務服務器應用程序中使用服務性組件有以下好處
  
  在使用的身份方面的靈活性不必只依賴於ASPNET身份
  
  受信任或權限較高的代碼能夠與主web應用程序隔離
  
  增加的進程躍距提高了攻擊難度它使得黑客更難跨越進程的邊界使用具有較高權限的進程
  
  如果需要手動處理LogonUser API調用的模仿我們可以在一個與主Web應用程序隔離的進程中完成這一工作
  
  開發服務性組件
  從COM+中接受服務的組合體被稱作服務性組件為了開發服務性組件開發人員必須具備豐富的COM+技術經驗COM+應用程序不是傳統意義上的應用程序它不包含用戶界面COM+應用程序實際上是構成應用程序的組件COM和NET的容器它不是新版的COM也不是COM和DCOM的組合而是遺傳自MTS(微軟事務服務)的一種技術
  
  下面是開發服務性組件所需要的步驟
  
  創建一個新類庫項目以開發作為Web應用程序類庫的中間層組件
  
  添加合適的類方法和屬性由於需要訪問文件和文件夾我們需要引入SystemIO名字空間
  
 

  
(圖

  
  創建一個Web窗體應用程序
  
 

  
(圖

  
  現在就可以對組件進行測試了為了在企業服務應用程序中實現較高的安全性必須使用Windows認證實現模仿這一工作可以在Web應用程序的nfig文件中實現它使得服務性組件能夠認證調用者並根據調用者的身份作出授權決策在開發期間盡管組件還不是服務性組件它仍然能夠為訪問共享文件和文件夾提供足夠的安全性
  
  <authentication mode=Window />
  <identity impersonate=true />
  
  要進行測試需要首先對類進行編譯然後將對象的引用添加到Web應用程序中對類進行如下所示的初始化
  
  Dim objEnterprise As New AccessingSharedResourcesdal_AccessNetwork()
  
  創建強命名組合體
  
  通過依次選擇Start Menu > Programs > Microsoft Visual Studio NET > Visual Studio NET Tools > Visual Studio NET Command Prompt運行Visual Studio NET Command Prompt
  
  找到項目所在的目錄並輸入下面的命令sn k KeyPairsnk
  
  上面的命令會創建一個公/私鑰對Visual Studio NET IDE可以用它們給我們的組件一個強命名另外需要注意的是在項目目錄中創建了一個KeyPairsnk文件
  
  打開AssemblyInfovb文件代碼窗口並添加下面的Assembly屬性
  
  <Assembly: AssemblyKeyFile(KeyPairsnk)>
  
  編譯該項目這將創建強命名的組合體
  
   Add the object to the GAC (Global Assembly Cache)
  
  在GAC(全局組合體緩沖區)中添加對象
  
  通過點擊Start Menu > Programs > Administrative Tools > Microsoft NET Framework Configuration打開NET框架配置工具
  
  點擊Select Assembly Cache > Select View List of Assemblies in the Assembly Cache浏覽GAC中所有的組合體
  
  右擊Assembly Cache圖標從彈出菜單中選擇Add
  
  找到該項目的bin目錄中的AccessingSharedResourcesdll文件並雙擊它
  
  注意如果命令提示行窗口仍然在運行輸入gacutil /i AccessingSharedResourcesdll也能夠將對象添加到GAC中這是在GAC中添加對象的第二種方法
  
  添加SystemEnterpiseServicesdll的引用
  
  引入恰當的Enterprise Services名字空間
  
  Imports SystemEnterpriseServices
  
  Imports SystemRuntimeCompilerServices
  
  Imports SystemReflection
  
  在各個類中繼承ServicedComponent類
  
  Public Class dal_AccessNetwork
  Inherits ServicedComponent
  
  在支持服務性組件的AssemblyInfovb文件中添加與服務性組件相關的組合體屬性
  
  引入SystemEnterpriseServices名字空間
  
  添加下面的代碼
  
  COM+應用程序名字
  < Assembly: ApplicationName(AccessingSharedResources)>
  COM+激活類型
  <Assembly: ApplicationActivation(ActivationOptionServer)>
  
  設置AssemblyVersion
  
  據MSDN上的文章(?url=/library/enus/dnnetsec/html/SecNetchasp)稱當新項目創建時由Microsoft Visual Studio(r) NET開發系統生成的缺省AssemblyVersion屬性是<Assembly: AssemblyVersion(*)>每當項目重建時就會產生新的組合體版本這也會產生識別服務性組件類的新的類識別符(CLSID)如果使用Regsvcsexe重
From:http://tw.wingwit.com/Article/program/net/201311/13866.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.