2011-05-10 90 views
1

我有一個簡單的應用程序拆分爲三個程序集。一種是允許用戶從註冊表讀取密鑰的客戶表單。其次是用戶登錄的授權表單。第三個是一個.dll庫,所有方法都在進行實際工作。使用多個程序集時請求主體權限失敗

我遵循MSDN教程執行聲明性安全檢查在這裏找到http://msdn.microsoft.com/en-us/library/dswfd229.aspx但仍然沒有工作。

創建GenericPrincipal對象是這樣的:

public static void CreatePrincipal(string user) 
    { 
     GenericIdentity MyIdentity = new GenericIdentity(user); 

     String[] MyString = { "Administrator", "User" }; 

     GenericPrincipal MyPrincipal = 
      new GenericPrincipal(MyIdentity, MyString); 

     Thread.CurrentPrincipal = MyPrincipal; 
    } 

這是位於該.dll裝配CustomPrincipal類。

在同一組件我有以下方法用RegistryOperations類:

[PrincipalPermissionAttribute(SecurityAction.Demand, Name = "admin1", Role = "User")] 
    public static string ReadDeclarative() 
    { 
     ... 
    } 

沒什麼特別。在我的「授權」組裝我有一個要求授權.dll文件方法GUI:

private void btnLogin_Click(object sender, EventArgs e) 
    { 
     CustomPrincipal.CreatePrincipal(txtUsername.Text); 
    } 

終於在第三,「客戶」組裝我呼籲該.dll方法來讀取註冊表項:

private void btnReadRegistry_Click(object sender, EventArgs e) 
    { 
     txtContents.Text = RegistryOperations.ReadDeclarative(); 
    } 

這不起作用。我通過授權程序集登錄,當我嘗試閱讀註冊表時,我得到主體權限請求失敗。 Visual Studio建議將程序集添加到一些神祕的完全信任列表中,但現在可以在VS2010中找到。請指教。

回答

0

當您登錄時,您是否使用用戶名admin1? (如果您不打算在權限驗證中檢查匹配的用戶名,則應將其從需求中刪除。)

+0

我確實打算檢查用於測試目的的匹配用戶名。我使用'admin1'用戶名進行登錄,所以不是這樣:( – barjed 2011-05-10 13:25:55

+0

在這種情況下,我不能重新編寫代碼。是否嘗試向btnReadRegistry_Click方法添加代碼以驗證Thread.CurrentPrincipal在執行時的內容? – 2011-05-10 16:33:59

+0

是的,我用調試器檢查過它的內容。 – barjed 2011-05-10 21:19:36