0

我在模拟用户时遇到问题。我有一个这样声明的方法:

[PrincipalPermission(SecurityAction.Demand, Name=@"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 的成员。

问题:

第一次调用 LocalTestGroupOnly() 成功,因为令牌指示的用户是 LocalTestGroup 的成员。对 LocalTestGroupOnly() 的第二次调用(作为默认用户)应该会失败,因为默认用户不是“Test”并且它不属于 LocalTestGroup。问题是这种方法也成功了。

如果我单独运行程序 - 无论有没有模拟,我们的行为都是正确的:它在模拟为“测试”时成功,在作为默认用户调用时失败。

这里有什么问题?

4

1 回答 1

1

你能检查Thread.CurrentPrincipal.Identity而不是WindowsIdentity.GetCurrent()吗?PrincipalPermission.Demand()使用第一个。

要更改Thread.CurrentPrincipal(或HttpContext.User),您似乎必须在模拟或撤消后明确设置它们。在这里查看类似的问题。

于 2009-05-05T06:02:30.427 回答