我在冒充用戶時遇到了麻煩。我宣佈這樣的方法:聲明式安全要求 - 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。問題是這種方法也成功了。
如果我單獨運行程序 - 有和沒有模擬,我們的行爲是正確的:它在冒充「測試」時成功,在作爲默認用戶調用時失敗。
這裏有什麼問題?
事實上:在context.Undo()之後,我必須添加Thread.CurrentPrincipal = new WindowsPrincipal(WindowsIdentity.GetCurrent()); 爲什麼沒有Undo()方法做到這一點?看起來我沒有完全理解Thread.CurrentPrincipal和WindowsImpersonationContext ... – pkolodziej 2009-05-05 06:21:58