有幾種方法可以用來訪問網絡資源:
·使用asp.net進程身份
·使用匿名用戶帳戶
·使用logonuser api
·使用服務性的組件(企業服務)
使用asp.net進程身份似乎有很明顯的缺陷。缺省情況下,當應用程序試著訪問資源時,asp.net進程身份提供一個身份(aspnet)。最簡單的解決方案是創建一個具有與遠程計算機上相匹配的用戶名和密碼的本地帳戶。大多數企業都會有龐大的內聯網,因此這一方法是不切實際的。另外,知道是誰在訪問資源也是非常重要的。盡管該方法足以訪問網絡資源,但效率不夠高;第二個方法是使用匿名帳戶,例如iusr_machine。與上面的原因相同,這種方法的效率顯然也不高;第三種方法是使用logonuser api,這種方法要求通過調用win32 logonuser api模仿一個特定的身份,還可以通過配置asp.net項目web.config文件中的<identity>元素進行模仿。據msdn上的一篇文章稱,不建議用戶使用以上這些方法,應當避免在windows 2000服務器上使用它們,因為它們要求向asp.net帳戶進程授予“作為操作系統一部分運行”的權限,從而極大地降低了web應用程序的安全性。因此,該方法也不理想。最后,也是最可行的解決該問題的方法是使用配置為作為用于訪問網絡資源固定身份運行的服務性組件。這種方法聽起來令人膽怯,但它是目前最好的解決方案,它的架構如下圖所示:
梅耶在http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/secnetch08.asp上發表的一一篇有關安全的文章中表示,在企業服務服務器應用程序中使用服務性組件有以下好處:
·在使用的身份方面的靈活性,不必只依賴于asp.net身份。
·受信任或權限較高的代碼能夠與主web應用程序隔離。
·增加的進程躍距提高了攻擊難度,它使得黑客更難跨越進程的邊界,使用具有較高權限的進程。
·如果需要手動處理logonuser api調用的模仿,我們可以在一個與主web應用程序隔離的進程中完成這一工作。
開發服務性組件
從com+中接受服務的組合體被稱作服務性組件。為了開發服務性組件,開發人員必須具備豐富的com+技術經驗。com+應用程序不是傳統意義上的應用程序,它不包含用戶界面。com+應用程序實際上是構成應用程序的組件、com和.net的容器,它不是新版的com,也不是com和dcom的組合,而是遺傳自mts(微軟事務服務)的一種技術。
下面是開發服務性組件所需要的步驟:
1、創建一個新類庫項目,以開發作為web應用程序類庫的中間層組件。
2、添加合適的類、方法和屬性。由于需要訪問文件和文件夾,我們需要引入system.io名字空間。
3、創建一個web窗體應用程序。
現在就可以對組件進行測試了。為了在企業服務應用程序中實現較高的安全性,必須使用windows認證實現模仿,這一工作可以在web應用程序的web.config文件中實現。它使得服務性組件能夠認證調用者,并根據調用者的身份作出授權決策。在開發期間,盡管組件還不是服務性組件,它仍然能夠為訪問共享文件和文件夾提供足夠的安全性。
<authentication mode="window" />
<identity impersonate="true" />
要進行測試,需要首先對類進行編譯,然后將對象的引用添加到web應用程序中。對類進行如下所示的初始化:
dim objenterprise as new accessingsharedresources.dal_accessnetwork()
4、創建強命名組合體
·通過依次選擇start menu --> programs --> microsoft visual studio .net --> visual studio .net tools --> visual studio .net command prompt運行visual studio .net command prompt。
·找到項目所在的目錄,并輸入下面的命令:sn -k keypair.snk。
·上面的命令會創建一個公/私鑰對,visual studio .net ide可以用它們給我們的組件一個強命名。另外需要注意的是,在項目目錄中創建了一個keypair.snk文件。
·打開assemblyinfo.vb文件代碼窗口,并添加下面的assembly屬性:
<assembly: assemblykeyfile("keypair.snk")>
·編譯該項目。這將創建強命名的組合體。
5. add the object to the gac (global assembly cache)
6、在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目錄中的accessingsharedresources.dll文件,并雙擊它。
注意:如果命令提示行窗口仍然在運行,輸入gacutil /i accessingsharedresources.dll,也能夠將對象添加到gac中。這是在gac中添加對象的第二種方法。
7、添加system.enterpiseservices.dll的引用
8、引入恰當的enterprise services名字空間
·imports system.enterpriseservices
·imports system.runtime.compilerservices
·imports system.reflection
9、在各個類中繼承servicedcomponent類
public class dal_accessnetwork
inherits servicedcomponent
10、在支持服務性組件的assemblyinfo.vb文件中添加與服務性組件相關的組合體屬性。
·引入system.enterpriseservices名字空間
·添加下面的代碼:
'com+應用程序名字
< assembly: applicationname("accessingsharedresources")>
'com+激活類型
<assembly: applicationactivation(activationoption.server)>
11、設置assemblyversion:
據msdn上的文章(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/secnetch09.asp)稱,當新項目創建時由microsoft visual studio(r) .net開發系統生成的缺省assemblyversion屬性是<assembly: assemblyversion("1.0.*")>。每當項目重建時,就會產生新的組合體版本,這也會產生識別服務性組件類的新的類識別符(clsid)。如果使用regsvcs.exe重復向組合體注冊組件服務,就會在components文件夾中看到具有不同clsid的復制的組件。
盡管這符合嚴格的com規則,能夠阻止現有的可管理和不可管理的客戶破壞它,在開發過程中仍然是非常煩人的。在測試和開發過程中,考慮通過使用如下所示的組合體級assemblyversion屬性設置一個明確的版本:
<assembly: assemblyversion("1.0.0.1")>
這一設置將阻礙每次編譯項目時產生新的clsid。
12、生成新的com+應用程序,在新的com+應用程序中注冊該組合體
·運行visual studio .net command prompt。
·找到bin目錄中dll文件的位置。
·輸入regsvcs /c accessingsharedresources.dll,并鍵入回車。
13、修改web應用程序
·添加system.enterrpiseservices.dll的引用
·在web客戶端軟件中添加imports system.enterpriseservices語句
到這一步,服務性組件就全部完成了。我們可以將該組件看作一個com+應用軟件。
·通過選擇start --> programs --> administrative tools --> component services運行component services manager。
·擴展console root --> component services --> computers --> my computer --> com+ applications --> accessingsharedresources--> components。
優點和缺點
使用服務性組件的優點如下所示:
·使用身份的靈活性,我們無須只依賴asp.net身份。
·受信任或權限較高的代碼可以與主web應用軟件隔離。
·增加的進程躍距提高了系統的安全性,使得黑客更難跨過進程邊界,接近權限較高的進程。
·如果需要處理帶有logonuser api調用的模仿,我們可以在與主web應用軟件隔離的進程中完成。
缺點如下所示:
·調用服務性組件的速度不如本地.net對象快,因此應用軟件的性能會受到影響。
·要求多余的步驟和代碼。
·與本地.net對象相比更難管理。
·需要在com+應用軟件中安裝dll。
結論
盡管沒有利用對象集中、事物支持、同步、事件跟蹤等com+的基本功能,我們已經完成了我們的對象。只在com+應用程序中安裝本地.net類和添加數行特殊的com+代碼就足以完成在網絡上訪問共享資源的任務。
新聞熱點
疑難解答
圖片精選