静态WindowsIdentity.Impersonate(IntPtr)与非静态Impersonate()

时间:2014-12-10 15:24:54

标签: c# impersonation

我对Web应用程序的模拟做了一些研究,最后我使用了this approach,它主要使用LogonUsernewId = new WindowsIdentity()newId.Impersonate()

注意我不想在此粘贴整个代码,因此帖子不会太长。

在Web上的几个示例中使用了相同的代码,因此它看起来非常可靠。但后来我也找到了this similar approach

第一个使用此实例方法:

public virtual WindowsImpersonationContext Impersonate()

第二个,这个静态方法:

public static WindowsImpersonationContext Impersonate(IntPtr userToken)

示例代码的唯一区别是:

using (WindowsIdentity newId = new WindowsIdentity(safeTokenHandle.DangerousGetHandle()))
{
    using (WindowsImpersonationContext impersonatedUser = newId.Impersonate())
    {
        // Check the identity.
        Console.WriteLine("After impersonation: " + WindowsIdentity.GetCurrent().Name);
    }
}

VS

using (WindowsImpersonationContext impersonatedUser = WindowsIdentity.Impersonate(safeTokenHandle.DangerousGetHandle()))
{
    // Check the identity.
    Console.WriteLine("After impersonation: " + WindowsIdentity.GetCurrent().Name);
}

一个人对另一个人有什么好处吗?仅仅为了简单起见,我认为如果WindowsIdentity对象没有以任何其他方式使用,第二个更好。

子问题1 :这个代码是在课程开头需要的吗?它永远不会被调用和评论它似乎根本不会影响功能。只调用SafeTokenHandle中的那个。

[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public extern static bool CloseHandle(IntPtr handle);

子问题2 :如果我将处置Undo()对象,是否需要调用WindowsImpersonationContext?例如:

using (WindowsImpersonationContext impersonatedUser = newId.Impersonate())
{
    // Whatever
    impersonatedUser.Undo(); // Is this useful?
}

文档建议调用它,但未指定Dispose()是否已经这样做。根据我的测试,处理对象就足够了。

子问题3 :调用DuplicateToken()RevertToSelf()有什么好处?我在this onethis one等示例中看过它们,但我找不到任何理由使用它们。

非常感谢阅读我的整个帖子,

安德鲁

1 个答案:

答案 0 :(得分:1)

静态方法在内部调用相同的代码,因此它更像是一种快捷方式。

不,如果您在using块中使用它,则无需调用Undo,因为Dispose将调用Undo。您应该在using块中使用它来正确处理被抛出的异常,除非您知道自己在做什么。

我不确定为什么CloseHandle会在第一堂课中出现。