Выдача себя за пользователя в Asp.Net

Мой администратор баз данных требует, чтобы весь доступ к базе данных осуществлялся через доверенную учетную запись домена. Это можно сделать, если вы установите web.config . Это требует, чтобы пользователь вошел в систему или находился в домене для передачи учетных данных IE. Я хочу выдать себя за пользователя с помощью кода. Я использую код, найденный в этой статье базы знаний:

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

Он отлично работает, я передаю учетные данные, выдаю себя за пользователя, затем делаю вызов в базу данных, и данные возвращаются.

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

Если IIS может олицетворять пользователя домена для всех страниц, то почему я не могу олицетворять пользователя при использовании кода?

Кажется, что-то с переключением контекста потока. Я попытался установить alwaysFlowImpersonatingPolicy в файле Aspnet.config, но это не сработало.

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

Любое предложение? Возможно ли вообще делать то, что я хочу?


person DKATDT    schedule 25.09.2008    source источник
comment
Проблема в том, что если я перехожу на другую страницу... значит ли это, что это запрос новой страницы. iis может использовать другой поток из пула для выполнения новой страницы, и у него не будет старой информации о контексте.   -  person Gulzar Nazim    schedule 25.09.2008
comment
Поможет ли этот вопрос?   -  person Jim Burger    schedule 25.09.2008


Ответы (2)


Олицетворение происходит на уровне потока. Олицетворение приводит к замене маркера доступа потока, который обычно наследуется от процесса, другим. Лучше всего отменить эффект олицетворения и, следовательно, токен, как только вы закончите операции, для которых он был необходим. История ничем не отличается от IIS или ASP.NET. Каждый запрос обычно обрабатывается отдельным потоком, поэтому вам придется заставить каждый поток олицетворять пользователя.

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

Так что это правильно.

Если IIS может олицетворять пользователя домена для всех страниц, то почему я не могу олицетворять пользователя при использовании кода?

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

Кажется, что-то с переключением контекста потока.

Не совсем. Если вы не выполняете асинхронную обработку (что вы не указываете в своем вопросе), поток контекста олицетворения не будет иметь значения. Вам нужно беспокоиться о передаче контекста олицетворения только в том случае, если вы вызываете переключение потока прямо или косвенно во время обработки одного запроса. Если вы хотите, чтобы работа, выполняемая вторичным (рабочим) потоком, продолжала выполняться в контексте олицетворения основного потока, вам необходимо убедиться, что вторичный поток заимствует токен олицетворения. В .NET Framework 1.1 вам придется проявлять большую осторожность и вручную управлять потоком контекста олицетворения. Однако в .NET 2.0 API ExecutionContext был введен и делает много тяжелой работы.

person Atif Aziz    schedule 25.09.2008

Причина, по которой вы теряете контекст олицетворения, заключается в том, что каждый раз, когда завершается запрос новой страницы, контекст олицетворения выходит за рамки.

В соответствии с документами <alwaysFlowImpersonationPolicy> используется для обеспечения того, чтобы один и тот же контекст олицетворения сохранялся при асинхронных вызовах. Например, при выполнении асинхронного вызова удаленной веб-службы контекст олицетворения обратного вызова совпадает с контекстом инициирующего потока. В случае ASP.NET контекст олицетворения будет передаваться только на время существования запроса страницы.

person Kev    schedule 25.09.2008