#.net #asp.net #sql-server #iis-7
#.net #asp.net #sql-сервер #iis-7
Вопрос:
Настройка:
IIS в Windows 2008 Server R2 Enterprise, SQL Server 2008 R2 Enterprise, ASP.NET Веб-приложение 2.0.
Цель:
Мы преобразуем модель безопасности старого веб-приложения с использования одной учетной записи SQL Server на использование учетных записей Active Directory. В ASP.NET приложение, которое мы добавили <identity impersonate="true" />
в качестве первого элемента в <system.web>
раздел web.config. Мы добавили роли базы данных, которые содержат группы Active Directory, для предоставления доступа к существующим хранимым процедурам. Наш web.config уже содержит <authentication mode="Windows"/>
. Вот моя строка подключения, редактирование имен серверов и БД:
<add name="DbConn"
connectionString="
Data Source=SERVER;
Initial Catalog=DBNAME;
Integrated Security=SSPI;"
providerName="System.Data.SqlClient"
/>
Проблема:
Я получаю сообщение об ошибке при попытке открыть SqlConnection к базе данных:
Не удалось войти в систему для пользователя ‘NT AUTHORITY АНОНИМНЫЙ ВХОД в СИСТЕМУ’.
Вместо того, чтобы проходить через все логические уровни приложения (от веб-страницы к слоям .DLL), я добавил быструю простую веб-страницу, которая выполняет некоторые Response.Write
Page_Load()
действия. Я получаю это (информация об учетной записи отредактирована):
HttpContext.Current.User.Идентификация.Имя = домен моя учетная запись
My.User.Name = домен моя учетная запись
Затем Page_Load
вызывает вспомогательный модуль, который выполняет некоторые Response.Write
действия, и пытается запустить существующую хранимую процедуру. Я понимаю это:
Перед открытием подключения к БД…
HttpContext.Current.User.Идентификация.Имя = домен моя учетная запись
My.User.Name = домен моя учетная запись
Сбой Sub TestDbCall ()! например. Сообщение = Ошибка входа для пользователя «NT AUTHORITY АНОНИМНЫЙ ВХОД в СИСТЕМУ».
При открытии SqlConnection с сообщением об ошибке выше (ошибка входа в систему …) происходит сбой. Очевидно, что ASP.NET приложение распознает мою доменную учетную запись. Кажется, что мои учетные данные Windows не распространяются из ASP.NET приложение к SQL Server. Я в недоумении, почему.
Редактировать:
Я нашел эту страницу на microsoft.com это говорит о том, что для доступа к SQL-серверу, которого нет на сервере IIS (кто бы это вообще СДЕЛАЛ ???), вы не можете использовать проверку подлинности Windows в IIS. Скорее, вы должны использовать базовую аутентификацию. Это работает, но мне не нравится идея, чтобы имя учетной записи пользователя и пароль перемещались по корпоративной сети в виде обычного текста. Поэтому, несмотря на то, что это «работает», я не принимаю свой собственный вывод в качестве ответа.
Комментарии:
1. Глупый вопрос: имеет ли ваша строка подключения «Доверенное соединение = true»?
2. в ваших настройках iis может быть что-то. Я не могу вспомнить, что нужно изменить, но я думаю, вам нужно изменить настройку пула приложений, чтобы не использовать учетную запись службы .net.
3. @Coding Gorilla:
Integrated Security=SSPI;
эквивалентно доверенному соединению.4. @HardCode правильно; просто хотел сначала проверить очевидное. Какие методы проверки подлинности разрешает веб-сайт (в IIS)?
5. @HardCode попробуйте изменить это на дайджест аутентификации и посмотреть, работает ли это.
Ответ №1:
Когда ваш IIS проверяет подлинность пользователя с помощью проверки подлинности Windows, а затем, выдавая себя за подключенного пользователя, подключается к любому ресурсу за пределами локального окна IIS (например, экземпляра SQL Server), процесс называется делегированием, как описано в разделе Переход по протоколу Kerberos и ограниченное делегирование . Процесс, который иногда неофициально называют «двойным переходом», является предметом многих инструкций:
Комментарии:
1. Я проверю это и посмотрю, что я могу придумать. Спасибо.
Ответ №2:
Требуется некоторая настройка IIS. Смотрите Следующий документ для хорошего объяснения:
Как получить доступ к SQL Server с помощью встроенной безопасности Windows
Комментарии:
1. Я нашел эту статью, но для нее требуется базовая аутентификация. Я не чувствую, что в круге технологий Microsoft (Active Directory, IIS, ASP.NET , SQL Server), что отправка информации для входа в систему по проводам в виде обычного текста является решением: (
2. @HardCode — я использую встроенную проверку подлинности Windows, которая не отправляет учетные данные в виде открытого текста. В статье упоминается об этом. Ваши настройки могут отличаться.
3. Находится ли ваш SQL Server в том же окне, что и IIS? Мои находятся в отдельных полях, поэтому в статье упоминается, что базовая аутентификация является единственным средством передачи токена безопасности на SQL Server.
4. @HardCode — Нет, мои IIS и SQL Server находятся в разных полях.
Ответ №3:
Я бы посоветовал изменить способ, которым вы собираетесь использовать AD в своем приложении.
Я бы сопоставил пользователей AD с внутренними пользователями приложения вместе с их ролями AD, сопоставленными с ролями приложений, и использовал роли приложений для определения доступа не к хранимым процедурам напрямую, а к функциям бизнес-уровня
Комментарии:
1. У меня есть роли базы данных (не роли приложений), с которыми сопоставляются группы Active Directory, и эти роли БД сопоставляются с SPS. Однако, в конце концов, все равно получается разрешить пользователям в группе AD доступ к SP.