在Asp.Net中模仿用户

时间:2008-09-25 00:04:56

标签: asp.net database-connection

我的DBA要求所有数据库访问都通过受信任的域帐户完成。如果设置web.config,则可以执行此操作。这要求用户登录或在域上为IE传递凭证。我想通过使用代码来冒充用户。我正在使用此知识库文章中的代码:

http://support.microsoft.com/kb/306158

它工作得很好,我传入凭据,冒充用户,然后调用数据库并返回数据。

问题是,如果我转到另一页,我会丢失我的模拟凭据。这意味着每次我调用数据库时都必须运行模拟代码。

如果IIS可以为所有页​​面模拟域用户,那么为什么我在使用代码时不能冒充用户?

似乎是线程上下文切换的东西。我已经尝试在Aspnet.config文件中设置alwaysFlowImpersonatingPolicy但它不起作用。

http://msdn.microsoft.com/en-us/library/ms229553.aspx

有什么建议吗?甚至可以做我想做的事情吗?

2 个答案:

答案 0 :(得分:3)

模拟发生在线程级别。模拟导致通常从进程继承的线程的访问令牌被另一个替换。最佳做法是在完成所需操作后立即恢复模拟的效果,从而恢复令牌的效果。这个故事与IIS或ASP.NET没有什么不同。每个请求通常由一个不同的线程处理,因此您必须让每个线程模拟用户。

  

这意味着我每次拨打电话   我必须运行数据库   冒充代码。

这是正确的。

  

如果IIS可以模拟域用户   对于所有页面,那么为什么我不能   在使用代码时冒充用户?

IIS没有做任何不同的事情,所以它可能只是一种被认为是错觉。它不能模仿所有页面的用户,除非所有页面都由同一个线程提供服务,并且在每个页面都被提供时,模拟的令牌从未被还原。

  

这似乎与线程有关   上下文切换。

不是真的。除非您正在进行异步处理(您未在问题中说明这一点),否则模拟上下文的流程将不相关。如果在处理单个请求期间直接或间接导致线程切换,则只需担心流动模拟上下文。如果您希望辅助(工作者)线程完成的工作继续在主要模拟的模拟上下文中发生,那么您需要确保辅助线程借用模拟令牌。在.NET Framework 1.1中,您必须非常小心并手动编排模拟上下文的流程。但是,使用.NET 2.0时,引入了ExecutionContext API并完成了许多繁重的工作。

答案 1 :(得分:1)

您丢失模拟上下文的原因是因为每次新页面请求结束时,模拟上下文都将超出范围。

根据文档<alwaysFlowImpersonationPolicy>用于确保在异步调用中维护相同的模拟上下文。例如,在对远程Web服务进行异步调用时,回调模拟上下文与发起线程相同。对于ASP.NET,模拟上下文仅在页面请求的生命周期内流动。