2010-05-10 4 views
87

Я знаю, что это почти дубликат: The error "Login failed for user 'NT AUTHORITY\IUSR'" in ASP.NET and SQL Server 2008 и Login failed for user 'username' - System.Data.SqlClient.SqlException with LINQ in external project/class library, но некоторые вещи не складываются по сравнению с другими приложениями на моем сервере, и я не знаю, почему. используется

Коробки:

Web Box
SQL Box
SQL Test Box

Мой Применение:

Я получил aASP.NET веб-приложения, который ссылается библиотека классов, использующая LINQ-to-SQL. Строка подключения правильно настроена в библиотеке классов. По Login failed for user 'username' - System.Data.SqlClient.SqlException with LINQ in external project/class library Я также добавил эту строку подключения к веб-приложению.

Строка подключения использует учетные данные SQL, как так (как в веб-приложения и библиотеки классов):

<add name="Namespace.My.MySettings.ConnectionStringProduction" 
     connectionString="Data Source=(SQL Test Box);Initial Catalog=(db name);Persist Security Info=True;User ID=ID;Password=Password" 
     providerName="System.Data.SqlClient" /> 

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

Проблема:

Я получаю следующее сообщение об ошибке:

System.Data.SqlClient.SqlException: Login failed for user 'DOMAIN\MACHINENAME$'. 

Теперь ссылающийся это The error "Login failed for user 'NT AUTHORITY\IUSR'" in ASP.NET and SQL Server 2008 он говорит, что это действительно служба локальной сети и с использованием любого другого без доменного имени не будет работать.

Но я смущен, потому что я проверил SQL SQL Server и SQL Test Box SQL Management Studio, и оба они имеют NT AUTHORITY/NETWORK SERVICE в разделе Безопасность -> Логины на уровне базы данных, которые не указаны в разделе Безопасность -> Пользователи, но на уровне базы данных Безопасность -> Пользователи, у которых есть пользователь, отображаемый в строке подключения.

На уровне NTFS на веб-сервере разрешения имеют NETWORK SERVICE, которые имеют полный контроль.

Причина, по которой я запутался, состоит в том, что на моем веб-сервере есть множество других веб-приложений, эта база данных ссылок как на SQL Box, так и на SQL Test Box, и все они работают. Но я не могу найти разницу между ними и моим текущим приложением, кроме того, что я использую библиотеку классов. Будет ли это важно? Проверка разрешений NTFS, настройка логинов безопасности на уровне серверов и баз данных, строка подключения и способ подключения (учетные данные SQL Server), пул приложений IIS и другие параметры папки - все те же.

Почему эти приложения работают без добавления машинного имени $ в разрешения любого из моих SQL-полей? Но это то, что говорит мне одна ссылка, чтобы решить эту проблему.

+0

Итак, чтобы вы не использовали пользователя базы данных? Мы создаем один и можем переключаться между ним и SA в зависимости от того, что нам нужно делать ... – jcolebrand

+0

В строке подключения я использую пользователя базы данных, который я создал в области Security -> Logins, добавил его в Security -> пользователей базы данных и предоставили ей разрешения dbo. Вот как я сделал все свои другие приложения. – SventoryMang

ответ

115

NETWORK SERVICE и LocalSystem будут аутентифицироваться всегда как локальная корреспондирующая учетная запись (встроенная служба сети и встроенная система), но обе будут удаленно аутентифицироваться как учетная запись компьютера.

Если вы видите сбой, например Login failed for user 'DOMAIN\MACHINENAME$', это означает, что процесс, выполняющийся как служба NETWORK SERVICE или как LocalSystem, обратился к удаленному ресурсу, прошел аутентификацию в качестве учетной записи компьютера и был лишен авторизации.

Типичный пример будет приложение ASP работает в наборе приложений пула использовать NETWORK SERVICE верительных и подключение к удаленному SQL Server: приложение пул будет аутентифицировать как машина работает приложение бассейн, и это учетная запись компьютера которому должен быть предоставлен доступ.

Когда доступ запрещен учетной записи компьютера, доступ к учетной записи компьютера должен быть предоставлен. Если сервер отказывается от входа в систему DOMAIN \ MACHINE $, вы должны предоставить права входа в домен DOMAIN \ MACHINE $ не в службу NETWORK SERVICE. Предоставление доступа к NETWORK SERVICE позволило бы выполнить локальный процесс NETWORK SERVICE для подключения, а не удаленный, поскольку удаленный будет аутентифицироваться, как вы предполагали, DOMAIN \ MACHINE $.

Если вы ожидаете, что приложение asp будет подключаться к удаленному SQL Server в качестве входа SQL, и вы получите исключения из DOMAIN \ MACHINE $, это означает, что вы используете встроенную защиту в строке подключения. Если это неожиданно, это означает, что вы испортили строки подключения, которые вы используете.

+0

Правильно, что я собрал, спасибо за объяснение. Тем не менее, этот вопрос по-прежнему остается, все мои приложения размещены на моем веб-сервере, но доступ к базе данных в SQL или SQL-тестах, которые будут удаленным доступом да? Тем не менее они работают ... но ни один из моих ящиков SQL не предоставляет доступ DOMAIN \ MACHINENAME $. – SventoryMang

+0

О, я также ожидаю подключения к SQL-серверу в качестве входа SQL, но я разместил строки подключения, я не использую Integrated Security = True, что еще это может быть? – SventoryMang

+2

Существует три возможных объяснения: 1) они используют SQL-аутентификацию вместо интегрированного auth (что представляется наиболее правдоподобным, поскольку в примере вы используете идентификатор пользователя и пароль в строке подключения); 2) они используют встроенный auth и запускаются в приложении опрос, который использует разные учетные данные, или 3) они используют интегрированный аут, но приложение ASP олицетворяет вызывающего абонента, тем самым вызывая ограниченное делегирование: http://technet.microsoft.com/en-us/library/cc739587%28WS.10%29. ASPX. –

10

Трюк, который работал для меня, чтобы удалить Integrated Security из моей строки подключения и добавить регулярные User ID=userName; Password=password строку соединения в App.config вашего libruary не может быть с помощью встроенной системы безопасности, но тот, созданный в Web.config есть!

+3

Огромное спасибо вам. Огромная, огромная помощь. Спасибо Спасибо спасибо. Это, я уверен, очень очевидно, но для будущих людей это User Id = что-то; Password = что-то; – shubniggurath

+1

Я получал ту же ошибку в заголовке сообщения. Я обнаружил, что «User Id = yourUserid Password = yourPassword» игнорируется, когда «trusted connection = true» присутствует в строке подключения к базе данных. Я удалил «trusted connection = true» из моей строки и исправил мою проблему. Это произошло не до тех пор, пока я не отложил приложение от отладки в VS 2012 до iis 8. –

9

Я добавил <identity impersonate="true" /> в свой web.config, и он отлично работал.

+4

Просто поймите, это изменит контекст, для которого приложение ASP.NET работает полностью. Вместо того, чтобы работать под контекстом «NETWORK SERVICE» по умолчанию, он будет запускаться в контексте пользователя с использованием приложения (то есть домена \ someUser). Иногда это нормально, но просто понимайте, что это изменение - это не просто быстрое исправление для OP и имеет другие последующие последствия, которые могут/не могут быть желательными. – atconway

+0

[MSDN on ] (https://msdn.microsoft.com/en-us/library/72wdk8cc (v = vs.71) .aspx) – Timothy

18

Эта ошибка возникает, когда вы настроили приложение в IIS, а IIS отправляется на SQL Server и пытается войти в систему с учетными данными, которые не имеют соответствующих разрешений. Эта ошибка также может возникать при настройке репликации или зеркалирования. Я буду решать решение, которое работает всегда и очень просто. Перейти к SQL Server >> Безопасность >> Логины и щелкните правой кнопкой мыши по NT AUTHORITY \ NETWORK SERVICE и выберите Свойства

Вновь открывшемся экране Свойства входа перейдите на вкладку «Сопоставление пользователей». Затем на вкладке «Сопоставление пользователей» выберите нужную базу данных - особенно базу данных, для которой отображается это сообщение об ошибке. На нижнем экране проверьте роль db_owner. Нажмите «ОК».

+2

Это решение для меня, поскольку веб-приложение и база данных находятся на такой же машина. У меня все еще есть ошибка «Ошибка входа в систему для пользователя« DOMAIN \ MACHINENAME $ », но добавление входа в систему для SQL не помогло, но добавив« NT AUTHORITY \ NETWORK SERVICE ». Хотя вам не следует использовать роль db_owner, если это не требуется, достаточно нормального db_datareader и db_datawriter. – JimiSweden

9

У коллеги была такая же ошибка, и это было связано с небольшой ошибкой конфигурации в IIS.
Неправильный пул приложений был назначен для веб-приложения.

Действительно, мы используем собственный пул приложений с конкретным идентификатором для удовлетворения наших потребностей.

В своем локальном диспетчере IIS -> Сайты -> Веб-сайт по умолчанию -> Наше имя веб-приложения -> Основные настройки ... Пул приложений был «DefaultAppPool» вместо нашего настраиваемого пула приложений.

Установка правильного пула приложений решила проблему.

2

Мы получали похожие сообщения об ошибках при обработке базы данных служб Analysis Services. Оказалось, что имя пользователя, которое использовалось для запуска экземпляра служб Analysis Services, не было добавлено в учетные записи безопасности SQL Server.

В SQL Server 2012 службы SQL Server и Analysis настроены на запуск по-разному по умолчанию. Если вы пошли по умолчанию, всегда убедитесь, что пользователь AS имеет доступ к вашему источнику данных!

+1

У меня была та же проблема. Ошибка SSAS одинакова, но учетная запись не является сетевой службой. Учетная запись на самом деле: NT Service \ MSOLAP $ INSTANCENAME – cdonner

5

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

Настройки могут быть сделаны в Internet Information Server (IIS 7+)> Пулы приложений> Настройки> Advanded Process Model> Идентичность

0

Я была такая же проблема раньше, удаление Persist Security Info=True из ConnectionString работал для меня.

0

Я потратил несколько часов, пытаясь исправить проблему, и, наконец, получил ее - браузер SQL Server был «остановлен». Исправление, чтобы изменить его в режим "Автоматический":

If it is disabled, go to Control Panel->Administrative Tools->Services, and look for the SQL Server Agent. Right-click, and select "Properties." From the "Startup Type" dropdown, change from "Disabled" to "Automatic".

quote from here

1

Проверьте, если у вас есть

User Instance=true 

в строке подключения. Попробуйте удалить его, чтобы решить вашу проблему.

7

В моем случае у меня был Identity="ApplicationPoolIdentity" для моего пула приложений IIS.

После того, как я добавил IIS APPPOOL\ApplicationName пользователей SQL Server, он работает.

+2

Я считаю, что это будет работать, только если IIS и SQL-сервер находятся на одной машине. –

+1

Это сработало для меня! У меня локальная настройка сервера IIS-SQL. –

5

В основном для решения этой проблемы мы должны иметь некоторые настройки, как

  • Web App Запуск под ApplicationPoolIdentity
  • Веб-приложение подключения к базам данных через ADO.NET с помощью проверки подлинности Windows в строке соединения

Строка соединения, используемая при аутентификации Windows, включает либо атрибут Trusted_Connection=Yes, либо эквивалентный атрибут Integrated Security=SSPI в Web.config файл

Соединение с моей базой данных находится в режиме аутентификации Windows. Поэтому я решил его просто изменяя Пулы приложений Идентичность из ApplicationPoolIdentity в моем журнале домена в учетных DomainName \ MyloginId

Шаг:

  1. Нажмите на Пулы приложений
  2. Выберите Название вашей заявки

  3. Перейти к Advanced Настройка

  4. Expand Process Model и нажмите Идентичность. Нажмите три точки на правом конце.
  5. Нажмите Set ... кнопку и предоставлять ваш журнал домен в учетных

Для меня это была решена.

Примечание: В производственной или ИТ-среде у вас может быть учетная запись службы в том же домене для идентификации пула приложений. Если это так, используйте учетную запись службы, а не логин.

1

Я также имел эту ошибку с проверкой подлинности пользователя SQL Server

Я попытался некоторые исправления, но они не работали.

Решение в моем случае состояло в том, чтобы настроить его «Режим аутентификации сервера», чтобы разрешить аутентификацию SQL Server в разделе «Управление»: «Свойства/Безопасность».

1

Единственный момент, о котором все, кажется, упускают из виду, это то, что вам может потребоваться интегрированная безопасность = истинная. Возможно, сайт работает под учетной записью пула. Все в порядке, и по-прежнему можно попасть на SQL-сервер с исходными учетными данными пользователя, а не с пула. Это называется ограниченным делегированием. Если вы включите его и настройте окна SPN, вы переводите учетные данные пула с запросами пользователя на конечную службу (SQL - это только одна такая служба). Вы должны зарегистрировать ОДИН И ТОЛЬКО SQL-сервер, который обслуживает запросы SQL на веб-сервере. Для меня это слишком сложно, чтобы попытаться точно описать здесь. Мне потребовалось некоторое время, чтобы проработать это самостоятельно.

Смежные вопросы