我们拥有同时为多个客户运行的 SAAS 应用程序。所有客户都使用相同的应用程序,通过检查用于访问应用程序的 URL,用户被重定向到组织的正确数据。
在水下,每个组织都有自己的数据库。为了确保用户不会意外地进入错误的数据库,我们希望将正在执行的请求模拟给只能访问正确数据库的用户。我们曾经这样做,这在经典模式下的 IIS 上运行良好。
但是,在集成管道模式下,我们遇到了线程问题。我们使用 HTTP 模块在“PreRequestHandlerExecute”事件中模拟对正确用户的请求。(显然)无法保证此方法与实际处理请求的处理程序在同一线程中执行的问题。这会导致模拟有时无法工作,因为处理请求的线程没有被模拟。
我在 GitHub ( https://github.com/PaulVrugt/ImpersonationExample/tree/master/ImpersonationTest ) 中创建了一个测试项目,演示了这个问题(为 vb.net 道歉,但你会明白的)。当你运行使用集成管道模式连接到IIS的示例时,你会看到有时没有使用模拟用户,并且每次不使用时,处理请求的线程的managedthreadid与使用的线程不同http模块。
现在我明白了为什么它“有时”不起作用,我开始怀疑我做错了。有没有办法实现我想要做的事情?
我们已经尝试在 global.asax 中的 prerequesthandler 中进行模拟,但这会导致同样的问题。