0

在研究 SQL CLR 存储过程时,我遇到了以下链接 Link for SQL Bulk Copy in CLR。在此链接中,用户已使用 WindowsIdentity currentIdentity = SqlContext.WindowsIdentity; WindowsImpersonationContext impersonatedIdentity = currentIdentity.Impersonate();

我无法理解 WindowsImpersonationContext 的用途。没有它的用​​途,我可以运行我的代码。谁能告诉我这个身份模拟的确切用途是什么。

4

1 回答 1

0

例如,如果你想在与进程相同的上下文中运行一个线程,你可以做类似这样的事情:

    private void ImpersonateThread()
    {
        new Thread(() =>
        {
            Thread.CurrentPrincipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
            //Do the work...
        }).Start();
    }

如果运行应用程序池作为一个用户运行并且身份验证模式设置为 Windows 身份验证的网站(在 MS-IIS 上),这非常有用。然后您可能希望线程在用户访问网站时运行。

更新:

我只是想澄清一下。该行:

  Thread.CurrentPrincipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());

只需将用户(用户仍未模拟到线程)转移到线程,以便其他组件可以看到用户是谁并在必要时使用该信息,例如:

        System.Security.Principal.WindowsImpersonationContext impersonationContext;
        impersonationContext =
            ((System.Security.Principal.WindowsIdentity)System.Threading.Thread.CurrentPrincipal.Identity).Impersonate();
            //Do the work that you want within the impersonated users context.
        impersonationContext.Undo();

在模拟和撤消之间,用户被模拟并且所有代码都以该用户身份运行。我知道此示例中的用户是相同的,但假设线程持有的用户与运行进程的用户完全不同(用户输入的内容或类似内容)。希望这可以帮助 :-)

于 2012-10-25T11:05:37.877 回答