在Asp.Net中模拟用户身份

3
我的数据库管理员要求所有的数据库访问都必须通过可信域帐户完成。如果您设置了web.config,这是可以做到的。这需要用户登录或在域上,IE才能通过凭据。我想使用代码来模拟用户。我正在使用此知识库文章中找到的代码:http://support.microsoft.com/kb/306158。它运行良好,我传递凭据,模拟用户,然后调用数据库并返回数据。问题是,如果我转到另一个页面,我就会失去模拟的凭据。这意味着每次我调用数据库时都必须运行模拟代码。如果IIS可以模拟所有页面的域用户,那么为什么我不能在使用代码时模拟用户?这似乎与线程上下文切换有关。我尝试在Aspnet.config文件中设置alwaysFlowImpersonatingPolicy,但它没有起作用。http://msdn.microsoft.com/en-us/library/ms229553.aspx。有什么建议吗?我想做的事情是否可能?

问题在于如果我转到另一页,这是否意味着它是一个新页面请求。IIS 可能会使用不同的线程从池中执行新页面,并且它将没有任何旧的上下文信息。 - Gulzar Nazim
这个问题会有帮助吗?(链接为https://dev59.com/KXVC5IYBdhLWcg3w-mdO) - Jim Burger
2个回答

3
模拟发生在线程级别。模拟会导致线程的访问令牌被替换为另一个,通常是从进程继承而来的。最佳实践是尽快撤销模拟的影响,因此撤销令牌,一旦您完成了需要它的操作。这与IIS或ASP.NET没有区别。每个请求通常由不同的线程处理,因此您将不得不使每个线程模拟用户。
这意味着每次我调用数据库时,都必须运行模拟代码。
所以这是正确的。
如果IIS可以为所有页面模拟域用户,那么我为什么不能在使用代码时模拟用户?
IIS并没有做任何不同,因此这可能只是一种错觉。除非所有页面都由相同的线程提供,并且在提供每个页面时都从未还原模拟令牌,否则它无法为所有页面模拟用户。
似乎与线程上下文切换有关。
不完全是这样。除非您正在执行异步处理(您在问题中没有说明),否则模拟上下文的流程不会相关。只有在处理单个请求期间直接或间接地引起线程切换时,您才需要担心流动模拟上下文。如果您希望由辅助(工作)线程执行的工作继续在主要线程的模拟上下文下发生,则需要确保辅助线程借用模拟令牌。在.NET Framework 1.1中,您必须非常小心并手动协调模拟上下文的流程。但是,使用.NET 2.0引入了ExecutionContext API,并且可以完成大部分繁重的工作。

1

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接