.NET的安全模型在系統的安全模型的上層,并且與一些服務器程序的安全特性結合的很好(當然,目前這些產品還僅限于微軟自己的產品,比如SQL Server和Internet Information Services (IIS))。正因為.NET與操作系統的層次不同,所以.NET程序的安全性就取決于這樣幾個因素:.NET安全性是如何配置的,程序組件是怎樣編寫的,以及一些由Windows,網絡設置或者其他程序設定的安全特性。
GenericIdentity類除了三個IIdentity接口定義的屬性之外沒有更多的東西了。不過,GenericIdentity類提供了兩個構造函數。一個構造函數接受一個字符串參數,該參數指定的是用戶名;另一個構造函數接受兩個參數:第一個是用戶名字符串,第二個是給定的驗證類型字符串。 public GenericIdentity(string name); public GenericIdentity(string name, string type); 現在我們不過多地講述使用GenericIdentity類的細節問題,在后面我們將會看到在一個實際的程序當中是如何使用GenericIdentity對象的。
GetAnonymous和GetCurrent方法都返回一個WindowsIdentity對象,使用也很簡單,我們需要注重的是Impersonate方法,該方法有兩個版本:實例版本(instance version)和靜態版本(static version)。實例版本的方法不帶參數,返回一個基于被調用WindowsIdentity對象的WindowsImpersonationContext對象(WindowsImpersonationContext類表示模擬操作之前的 Windows 用戶);靜態版本則需要一個IntPtr參數。這種模擬操作對于服務器程序來說是很有用的,它可以降低客戶端訪問服務器所用用戶帳號的權限,從而在一定程度上提高了安全性。下面是上述方法的具體語法: public static WindowsIdentity GetAnonymous(); public static WindowsIdentity GetCurrent(); public virtual WindowsImpersonationContext Impersonate(); public static WindowsImpersonationContext Impersonate(IntPtr userToken); Principal對象
下面是驗證的過程: //取得當前線程的principal對象 IPrincipal principal = Thread.CurrentPrincipal;
if (!principal.Identity.Name.Equals("TrustedUser")) { throw new SecurityException( strUserName + " NOT PERMITTED to proceed./n"); } Console.WriteLine( strUserName + " is PERMITTED to proceed./n"); WindowsPrincipal類
WindowsPrincipal類作為我們在開發中最常碰到的實現了IPrincipal接口的類,構造函數相當簡單: public WindowsPrincipal(WindowsIdentity ntIdentity);
下面的代碼說明了如何創建一個WindowsPrincipal對象: WindowsIdentity wi = WindowsIdentity.GetCurrent(); WindowsPrincipal wp = new WindowsPrincipal(wi); WindowsPrincipal類中需要注重的是下面這三個重載的IsInRole方法: public virtual bool IsInRole(int); 第1個重載函數接受一個整型參數,該參數表示用戶組對應的RID(RID也就是與域相關聯的下級憑證(domain-relative subauthority)ID)。RID值定義在Platform SDK的頭文件Winnt.h中,Winnt.h中包括一些常見的用戶和組,比如DOMAIN_USER_RID_ADMIN、 DOMAIN_USER_RID_GUEST、DOMAIN_GROUP_RID_ADMINS、DOMAIN_GROUP_RID_USERS和DOMAIN_GROUP_RID_GUESTS等等,可以在.../Microsoft Visual Studio .NET/Vc7/PlatformSDK/Include文件夾中找到該文件。 public virtual bool IsInRole(string); 第2個重載函數接受一個字符串參數,該參數表示一個用戶組名稱,比如MYCOMPUTER/Developer(MachineName/GroupName)表示了機器名為MYCOMPUTER的計算機上的Developer用戶組。不過對于系統內置的用戶組就不能這樣表示了,比如Administrators,不能表示為MYCOMPUTER/Administrators,而應該像BUILTIN/Administrators這樣,不過這樣總覺得有點多余,不夠自然。于是我們可以使用下面的重載函數。 public virtual bool IsInRole(WindowsBuiltInRole);