安全探索——.NET 中的角色安全

安全探索——.NET 中的角色安全(1) 2009-02-20 來自:java060515  [收藏到我的網摘]

<script type="text/javascript"></script> <script src="http://z.csdn.net/adjs.php?n=529554701&what=zone:203&charset=utf-8&exclude=,&referer=http%3A//www.csdn.net/" type="text/javascript"></script>

 

.NET Framework出來有段時間了,也逐漸壯大了,自然安全性也是必不可少的。本文將說說.NET中的角色安全,也是本人最近學習總結的。

說道基於角色的安全,.NET 中有2個主要的類型來支持這個,即 IIdentity 接口 和 IPrincipal 接口

IIdentity 接口 是標識對象的基礎接口,包含3個屬性:訪問名稱的 Name 和 身份驗證類型的 AuthenticationType 以及一個表示用戶是否通過驗證的IsAuthenticated。

IPrincipal 接口 是主體對象的基礎接口,包含一個 Identity 屬性,用於訪問關聯的 Identity 對象。和一個 IsInRole 方法,用於確定 Principal 對象所標識的用戶是否爲給定角色的成員。

上面2個體到的都是藉口,實際用到是實現的類,後面也有介紹。

恩,說道這裏,大家可能還不知道 標識對象 和 主體對象 是什麼。我簡單說明一下:

標識對象封裝有關正在驗證的用戶或實體的信息。至少標識對象包含名稱和身份驗證類型。(可以通過自定義實現接口類擴充,下同)

主體對象表示代碼運行時所在的安全上下文。主要包含了主體對象和關聯的(多個)角色。


(如果對這些詞彙不明白,可以參考MSDN上的文章 安全性的基礎概念 )

說完了主體對象,在說說主體,主體表示一個用戶的標識和角色,並代表此用戶操作。 .NET Framework 中基於角色的安全性支持三種主體:

一般主體表示獨立於 Windows NT 和 Windows 2000 用戶和角色存在的用戶和角色。

Windows 主體表示 Windows 用戶及其角色(或其 Windows NT 和 Windows 2000 組)。Windows 主體可模擬其他用戶,這意味着此類主體在表示屬於某一用戶的標識的同時,可代表此用戶訪問資源。

自定義主體可由應用程序用該應用程序所需的任何方式定義。

好了,到此爲止,基本內容介紹完了。這就要結束了嗎?恩,實際上我很想的,不過怕板磚飛來,實際上也沒有結束.

WindowsIdentity類 和 WindowsPrincipal 類

這2個類使用來表示 Windows 用戶 和 Windows 組成員身份的。

有關這2個類的詳細信息,請參考 MSDN WindowsIdentity 類 WindowsPrincipal 類)




http://images.cnblogs.com/cnblogs_com/GSonOVB/WindowsLiveWriter/6e206e933c8d.NET1_120C3/clip_image006_thumb.png



使用 WindowsPrincipal 對象,有兩種創建 WindowsPrincipal 對象的方法,使用的哪個取決於代碼是必須重複執行基於角色的驗證還是隻需執行一次驗證。


如果代碼必須重複執行基於角色的驗證,則以下過程中的第一個過程產生的系統開銷較小。如果代碼只需進行一次基於角色的驗證,則可通過使用以下過程中的第二個過程來創建 WindowsPrincipal 對象。


方法1:


1、調用AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal) ,將當前程序設置 Windows 主體策略。(也可以調用VB的 My.User.InitializeWithWindowsUser() 方法。不過這個方法對多線程有兼容問題。WinForms 沒有問題。)

2、通過 Thread.CurrentPrincipal 獲取主體,也可以根據需要,轉換類型 Dim MyPrincipal As WindowsPrincipal = CType(Thread.CurrentPrincipal, WindowsPrincipal) 。


方法2:


1、通過調用靜態 WindowsIdentity.GetCurrent 方法初始化新的 WindowsIdentity 對象。
Dim MyIdentity As WindowsIdentity = WindowsIdentity.GetCurrent()

2、創建一個新的 WindowsPrincipal 對象,並將在前面的步驟中創建的 WindowsIdentity 對象的值傳遞給該對象。
Dim MyPrincipal As New WindowsPrincipal(MyIdentity)


提示:在.NET 2.0 之後的VB中,可以使用My.User 來快速訪問。My.User 中主要包含 :

名稱
說明

CurrentPrincipal
獲取或設置當前主體(對基於角色的安全性而言)。
IsAuthenticated 獲取一個值,該值指示是否驗證了用戶。
Name 獲取當前用戶的名稱。
InitializeWithWindowsUser 將線程的當前主體設置爲啓動應用程序的 Windows 用戶。

使用方法,和上面的類似,主要代替了Thread.CurrentPrincipal。

提示:在使用字符串檢測Windows內置組的時候,需要在組名前面加 “BUILTIN/”,像這樣 “BUILTIN/Administrators”


模擬與恢復

模擬是指當前用戶 使用另外一個帳戶的標記進行某個操作並並再次恢復到原先的帳戶。

1、通過調用非託管的 LogonUser 方法,檢索特定用戶的帳戶標記。此方法不在 .NET Framework 基類庫中,而在非託管 advapi32.dll 中。具體參考代碼

2、創建 WindowsIdentity 類的一個新實例,並向其傳遞標記。
Dim ImpersonatedIdentity As New WindowsIdentity(hToken)

3、創建 WindowsImpersonationContext 類的一個新實例,並用已初始化類的 WindowsIdentity.Impersonate 方法對其進行初始化以開始模擬。
WindowsImpersonationContext MyImpersonation = ImpersonatedIdentity.Impersonate()

4、當不再需要模擬時,調用 WindowsImpersonationContext.Undo 方法還原模擬。
MyImpersonation.Undo()

有關WindowsImpersonationContext 類 的詳細信息,可以參考MSDN WindowsImpersonationContext 類

注意:

在 Windows Vista 中,用戶帳戶控制 (UAC) 確定用戶的特權。如果您是內置管理員組的成員,將會給您分配兩個運行時訪問標記:標準用戶訪問標記和管理員訪問標記。默認情況下,您擁有標準用戶角色。當您嘗試執行需要管理特權的任務時,可以使用“同意”對話框動態提升自己的角色。執行 IsInRole 方法的代碼不顯示“同意”對話框。如果您擁有標準用戶角色,即使您屬於內置管理員組,代碼也會返回 false。您可以在執行代碼前提升自己的特權,方法是右擊應用程序圖標,然後指示您需要以管理員身份運行它

發佈了35 篇原創文章 · 獲贊 6 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章