【问题标题】:Impersonating a User in Asp.Net在 Asp.Net 中模拟用户
【发布时间】:2008-09-25 00:04:56
【问题描述】:

我的 DBA 要求通过受信任的域帐户完成所有数据库访问。如果您设置 web.config ,则可以做到这一点。这要求用户登录或在域上,以便 IE 传递凭据。我想通过使用代码来模拟用户。我正在使用这篇知识库文章中的代码:

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

效果很好,我传入凭据,模拟用户,然后调用数据库并返回数据。

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

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

这似乎与线程上下文切换有关。我尝试在 Aspnet.config 文件中设置 alwaysFlowImpersonatingPolicy,但没有成功。

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

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

【问题讨论】:

  • “问题是如果我转到另一个页面” ..这是否意味着这是一个新页面请求。 iis 可能使用池中的不同线程来执行新页面,它不会有任何旧的上下文信息..
  • this question有帮助吗?

标签: asp.net database-connection


【解决方案1】:

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

这意味着每次我打电话给 我必须运行的数据库 模拟代码。

这样说是对的。

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

IIS 的做法并没有什么不同,因此它可能只是一种错觉。它不能模拟所有页面的用户,除非所有页面都由同一个线程提供服务,并且在提供每个页面时从未恢复模拟的令牌。

好像是带线的东西 上下文切换。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-10
      • 2020-06-19
      • 2012-10-12
      • 2011-12-11
      • 2011-05-14
      • 2013-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多