在研究SQL CLR存储过程时,我遇到了以下链接Link for SQL Bulk Copy in CLR 。
在此链接中,用户已使用
WindowsIdentity currentIdentity = SqlContext.WindowsIdentity;
WindowsImpersonationContext impersonatedIdentity = currentIdentity.Impersonate();
我无法理解WindowsImpersonationContext的用途。没有它的使用我可以运行我的代码。任何人都可以告诉我这个身份模拟的确切用途。
答案 0 :(得分:0)
E.g。如果你想在与进程相同的上下文中运行一个线程,你可以做类似的事情:
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();
在模拟和撤消之间,用户被模拟,所有代码都以此用户身份运行。我知道这个示例中的用户是相同的,但想象一下该线程拥有的用户与运行该进程的用户完全不同(用户输入的内容或类似内容)。希望这会有所帮助: - )