2009-05-04 22 views
0

我在冒充用戶時遇到了麻煩。我宣佈這樣的方法:聲明式安全要求 - SecurityAction.Demand是否緩存?

[PrincipalPermission(SecurityAction.Demand, [email protected]"DJPITER-PC\Test", Role="LocalTestGroup")] 
static void LocalTestGroupOnly() 
{ 
    Console.WriteLine("Inside LocalTestGroupOnly() - {0}", 
     WindowsIdentity.GetCurrent().Name); 
} 

調用代碼:

WindowsImpersonationContext context = 
     WindowsIdentity.Impersonate(token); 

    Console.WriteLine("Calling LocalTestGroupOnly() as {0}", 
     WindowsIdentity.GetCurrent().Name); 
    LocalTestGroupOnly(); 

    context.Undo(); 

    try 
    { 
     // Reverted user is displayed properly 
     Console.WriteLine("Calling LocalTestGroupOnly() as {0}", 
      WindowsIdentity.GetCurrent().Name); 

     // This method should fail but if succeeds 
     LocalTestGroupOnly(); 
    } 
    catch (SecurityException ex) 
    { 
     Console.WriteLine("Your account lacks permission to that function."); 
    } 

默認用戶是不是LocalTestGroup的成員。 由LocalTestGroup的標記IS成員指示的用戶。

問題:

第一次調用LocalTestGroupOnly()成功,因爲用戶令牌指示IS LocalTestGroup的構件。對LocalTestGroupOnly()的第二個調用(默認用戶)應該失敗,因爲默認用戶不是「Test」,並且它不屬於LocalTestGroup。問題是這種方法也成功了。

如果我單獨運行程序 - 有和沒有模擬,我們的行爲是正確的:它在冒充「測試」時成功,在作爲默認用戶調用時失敗。

這裏有什麼問題?

回答

1

您能否檢查Thread.CurrentPrincipal.Identity而不是WindowsIdentity.GetCurrent()PrincipalPermission.Demand()使用第一個。

要更改Thread.CurrentPrincipal(或HttpContext.User),似乎必須在模擬後或撤消後明確設置它們。檢查here有類似的問題。

+0

事實上:在context.Undo()之後,我必須添加Thread.CurrentPrincipal = new WindowsPrincipal(WindowsIdentity.GetCurrent()); 爲什麼沒有Undo()方法做到這一點?看起來我沒有完全理解Thread.CurrentPrincipal和WindowsImpersonationContext ... – pkolodziej 2009-05-05 06:21:58