Олицетворение с использованием httpmodule, проблема с потоками

У нас есть приложение SAAS, которое работает для нескольких клиентов одновременно. Все клиенты используют одно и то же приложение, и, проверив URL-адрес, используемый для доступа к приложению, пользователи перенаправляются на правильные данные для организации.

Под водой каждая организация имеет свою базу данных. Чтобы пользователи случайно не оказались в неправильной базе данных, мы хотим олицетворять выполняемый запрос пользователю, который имеет доступ только к правильной базе данных. Мы привыкли делать это, и это прекрасно работало на IIS в классическом режиме.

Однако в режиме интегрированного конвейера мы сталкиваемся с проблемой многопоточности. Мы используем HTTP-модуль для олицетворения запроса правильному пользователю в событии "PreRequestHandlerExecute". Проблема в том, что (по-видимому) нет гарантии, что этот метод выполняется в том же потоке, что и обработчик, который фактически обрабатывает запрос. Это приводит к тому, что олицетворение иногда не работает, поскольку поток, обрабатывающий запрос, не олицетворяется.

Я создал тестовый проект в GitHub ( https://github.com/PaulVrugt/ImpersonationExample/tree/master/ImpersonationTest), демонстрирующий проблему (извинения за vb.net, но вы поймете эту идею). При запуске примера, подключенного к IIS с использованием режима интегрированного конвейера, вы увидите, что иногда олицетворенный пользователь не используется, и каждый раз, когда он не используется, управляемый поток потока, обрабатывающего запрос, отличается от потока, используемого в модуль http.

Теперь, когда я понимаю, почему это "иногда" не работает, я начинаю подозревать, что все это происходит неправильно. Есть ли способ достичь того, что я пытаюсь сделать?

Мы уже пытались выдать себя за обработчик prerequest в global.asax, но это приводит к той же проблеме.

0 ответов

Другие вопросы по тегам