声明性安全性要求 - SecurityAction.Demand是否已缓存?

时间:2009-05-04 20:35:24

标签: .net security permissions code-access-security

我在冒充用户时遇到了麻烦。我有一个声明如下的方法:

[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的令牌IS成员指示。

问题:

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

如果我单独运行程序 - 无论是否有模拟,我们都会纠正这种行为:当模仿为“测试”时它会成功,而在调用默认用户时则会失败。

这里有什么问题?

1 个答案:

答案 0 :(得分:1)

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

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