Почему Windows / встроенная проверка подлинности в IIS не передает учетные данные пользователя в SSRS и SQL? - PullRequest
7 голосов
/ 16 сентября 2011

Issue : В ASP.NET 4.0 я использую веб-службу ReportService2005.asmx моего сервера SSRS 2005 для получения списка отчетов. Также в .NET я использую Entity Framework для связи с моей базой данных MS-SQL 2005. Когда я использую Visual Studio Development Server в качестве своего веб-сервера, вызовы SSRS и SQL работают нормально. Но когда я переключаюсь на IIS 5.1, и SSRS, и код Entity выдают ошибки. Я использую только Windows / встроенную аутентификацию в IIS.

Ошибка : Для SSRS я получаю The request failed with HTTP status 401: Unauthorized.

Для Entity Framework я получаю Login failed for user ''. The user is not associated with a trusted SQL Server connection.

Попытки решения : В Web.Config я добавил <identity impersonate="true" />, и это исправило ошибки Entity Framework, но не ошибки SSRS. Я расширил ссылку identity, включив в нее мое имя пользователя и пароль, и это исправило все ошибки.

Вопрос : Почему указание моего имени пользователя и пароля исправляет ошибки и почему SQL говорит, что я не указываю имя пользователя ('')? Я думал, что Windows Authentication автоматически выдавала себя за текущего пользователя. Как я могу это исправить без жесткого кодирования «служебной» учетной записи в web.config?

Ответы [ 2 ]

11 голосов
/ 16 сентября 2011

Windows или встроенная проверка подлинности означает, что пользователь идентифицируется с помощью учетных данных Windows (или токена), но это не означает, что запрос выполняется под этим пользователем.ASP.NET во время выполнения выполнит запрос под удостоверением рабочего процесса (пула приложений), если вы не настроите его для олицетворения какой-либо другой идентичности.

Поэтому, когда вы обращаетесь к сайту с помощью сервера разработки, сервер работает подваша идентификация и, следовательно, доступ к SSRS и Sql Server осуществляется под вашей идентификацией и работает.

Когда вы загружаете свой сайт под IIS, ASP.NET-запрос будет выполняться под любым идентификатором, настроенным для пула приложений.Обычно это удостоверение является локальным пользователем, и, следовательно, доступ к сетевым ресурсам, таким как SSRS или Sql Server, будет запрещен.При добавлении <identity impersonate="true" username="your name" ../> ASP.NET будет выполнять запросы под вашей идентификацией, и это должно работать как для SSRS, так и для Sql Server.

Любопытный случай здесь - <identity impersonate="true" /> - при этом параметре ASP.NET будет выдавать себя за аутентифицированную идентификацию Windows.Однако для правильной работы необходимо настроить IIS и ASP.NET на встроенную проверку подлинности и запретить анонимный доступ (как в ASP.NET, так и в IIS).Невыполнение этого требования может привести к не аутентификации личности текущего пользователя, и запрос будет выполняться под идентификатором анонимного пользователя (как настроено в IIS).Если вы отметили встроенную аутентификацию в IIS, но не в ASP.NET, то идентификация не будет передана в запрос ASP.NET.Вам нужно проверить свою среду, чтобы увидеть, с каким именно сценарием вы столкнулись, но в конечном итоге ваш запрос ASP.NET выполнялся с учетными данными, которые имеют доступ к SQL Server, но не к SSRS.

8 голосов
/ 16 сентября 2011

Вам также необходимо знать о проблеме «двойного прыжка» - это означает, что ваши учетные данные могут использоваться только дважды.

Если вы заходите на веб-сайт с использованием аутентификации и подмены Windows, этот веб-сайт можетдругой сервис, как вы.Если эта другая служба является другим веб-сайтом (например, службами Reporting Services), который, в свою очередь, вызывает другую службу (например, базу данных), она не сможет повторно передать ваши учетные данные.Это означает, что база данных выдаст ошибку, если она ожидает учетные данные от пользователя.

...