應用框架的設計與實現——.NET平臺(10 授權服務.PrincipalPermissionAttribute)

PrincipalPermissionAttribute (主體權限屬性)是.net框架中定義的特性,它的使用方式如下:

[PrincipalPermission(SecurityAction.Demand,Role=@"BUILTIN/Administrators")]
Public static void SecureMethod()
{
    Console.WriteLine("Access the method succesfully");
}

該特性的作用是檢查調用者身份,如果調用者是BUILTIN/Administrators組的成員沒有問題,否則會獲得一個安全異常:“請求主體權限失敗”。
在.net中啓動一個應用程序時,CLR將爲它創建一個新線程。儘管實際的Win32線程含有調用者的身份信息,但在默認情況下,這個新線程並不附帶任何安全信息。如果一個 BUILTIN/Administrators 組的成員執行的應用程序中調用到了以上方法,那麼他也會獲得這個安全異常。
如何才能正常的調用以上方法哪?將WindowsPrincipal對象賦值給這個線程的相關屬性,只要調用者是  BUILTIN/Administrators 組的成員,他可以正常的調用以上方法。

實現方式如下,在調用SecureMethod()方法之前執行以下代碼:

WindowsPrincipal wp = new WindowsPrincipal(WindowsIdentity.GetCurrent());
Thread.CurrentPrincipal = wp;

因爲 PrincipalPermission 的驗證是從 IPrincipal 接口驗證的,使用其它繼承自 IPrincipal 接口的類對象也可以。我們也可以自定義繼承自 IPrincipal 接口的主體類,用於線程控制。

// 僞造用戶
GenericIdentity gi = new GenericIdentity("FakeUser");
GenericPrincipal gp = new GenericPrincipal(gi, new string[1]{@"BUILTIN/Administrators"});
Thread.CurrentPrincipal = gp;

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章