Ошибка входа для пользователя DOMAIN \ MACHINENAME $

120

Я знаю, что это почти дубликат: Ошибка «Не удалось войти в систему для пользователя NT AUTHORITY \ IUSR» в ASP.NET и SQL Server 2008 и Ошибка входа в систему для пользователя «имя пользователя» - System.Data.SqlClient.SqlException с LINQ в внешний проект / библиотека классов, но некоторые вещи не складываются по сравнению с другими приложениями на моем сервере, и я не уверен, почему.

Используемые ящики:

Web Box
SQL Box
Тестовое окно SQL

Мое заявление:

У меня есть веб-приложение ASP.NET, которое ссылается на библиотеку классов, использующую LINQ-to-SQL. Строка подключения настроена правильно в библиотеке классов. В соответствии с ошибкой входа в систему для имени пользователя - System.Data.SqlClient.SqlException с LINQ во внешней библиотеке проекта / класса, я также добавил эту строку подключения в веб-приложение.

Строка подключения использует учетные данные 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$'.

Ссылаясь на это Ошибка «Не удалось войти в систему для пользователя NT AUTHORITY \ IUSR» в ASP.NET и SQL Server 2008, в ней говорится, что на самом деле служба локальной сети и использование любого другого имени, не являющегося доменом, не будет работать.

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

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

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

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

SventoryMang
источник
Итак, напомним, вы не используете пользователя базы данных? Мы создаем один и можем переключаться между ним и SA в зависимости от того, что нам нужно сделать ...
jcolebrand
В строке подключения я использую пользователя базы данных, которого я создал в области Security -> Logins, добавил его в Security -> users базы данных и дал ему разрешения dbo. То же самое я делал и со всеми другими своими приложениями.
SventoryMang
Вот четкое объяснение из MSDN с использованием имени машины по умолчанию, в основном вы просто добавляете домен / машину $ в sql, не нажимая на поиск. blogs.msdn.microsoft.com/ericparvin/2015/04/14/…
Бретт Майвальд,

Ответы:

156

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

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

Типичным примером может служить приложение ASP, работающее в пуле приложений, настроенном на использование учетных данных СЕТЕВОЙ СЛУЖБЫ и подключение к удаленному серверу SQL: пул приложений будет проходить проверку подлинности как компьютер, на котором запущен пул приложений, и является ли эта учетная запись компьютера, которой необходимо предоставить доступ ,

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

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

Ремус Русану
источник
2
Правильно, что я собрал, спасибо за объяснение. Тем не менее, вопрос все еще остается, все мои приложения размещены на моем веб-сервере, но имеют доступ к базе данных в тестовых полях SQL или SQL, это был бы удаленный доступ, да? Тем не менее, они работают ... но ни один из моих ящиков SQL не предоставляет доступ к DOMAIN \ MACHINENAME $.
SventoryMang
1
О, Кроме того, я ожидаю подключиться к SQL-серверу в качестве входа в систему SQL, но я разместил свои строки подключения, я не использую параметр Integrated Security = True, что еще это может быть?
SventoryMang
2
Есть три возможных объяснения: 1) они используют аутентификацию SQL вместо встроенной аутентификации (которая кажется наиболее правдоподобной, поскольку в вашем примере есть идентификатор пользователя и пароль в строке conn) 2) они используют встроенную аутентификацию и запускаются в опросе приложения который использует другие учетные данные или 3) они используют встроенную аутентификацию, но приложение ASP олицетворяет вызывающего, тем самым вызывая ограниченное делегирование: technet.microsoft.com/en-us/library/cc739587%28WS.10%29.aspx .
Ремус Русану
2
Ваш проект веб-приложения должен ссылаться на проект библиотеки классов , а не на dll. Добавьте проект библиотеки классов в решение веб-приложения, затем удалите ссылку на dll и добавьте ссылку на проект. Таким образом, при развертывании или тестировании розничное веб-приложение будет ссылаться на dll розничного класса, а отладка будет автоматически ссылаться на отладку.
Ремус Русану
1
Хотя это все хорошо, но как добавить логин машины в SQL? - Они оба находятся в одном домене, и я бы предпочел использовать интегрированную безопасность. Но просто добавить учетную запись с именем «Domain \ MachineName $» полностью не удается (например, ее не существует, а обозреватель объектов давится и не может найти ничего подобного).
BrainSlugs83
33

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

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

Заин Али
источник
7
Для меня это было решением, поскольку веб-приложение и база данных находятся на одном компьютере. Я по-прежнему получаю сообщение об ошибке «Не удалось войти в систему для пользователя DOMAIN \ MACHINENAME $», но добавление машины в учетные записи SQL не помогло, а вот добавление «NT AUTHORITY \ NETWORK SERVICE» помогло. Хотя вы не должны использовать роль db_owner, если она не нужна, обычно достаточно db_datareader и db_datawriter.
JimiSweden,
18

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

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

nZeus
источник
5
Я считаю, что это будет работать, только если IIS и SQL-сервер находятся на одном компьютере.
Роб Дэвис
1
Это сработало для меня! У меня есть локальный сервер IIS-SQL.
Вин
1
Большое спасибо. Эта проблема возникла у меня после обновления моей локальной среды разработки с SQL Server 2014 до 2017. Ваше предложение было серебряной пулей в этой ситуации.
MFry
Спасибо, у меня тоже сработало. Я хотел бы подчеркнуть, что сообщение об ошибке по-прежнему `` Ошибка входа в систему для пользователя 'DOMAIN \ MACHINENAME $', даже если пул приложений настроен на работу под идентификатором пула, а вход в систему не выполняется, даже если 'DOMAIN \ MACHINENAME $' на самом деле получает разрешения на подключение. Мне кажется, сообщение об ошибке вводит в заблуждение.
mivra
16

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

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

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

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

Шаг:

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

  3. Перейти к расширенным настройкам

  4. Разверните Модель процесса и щелкните Удостоверение . Щелкните три точки на правом конце.
  5. Нажмите кнопку Установить ... и укажите учетные данные для входа в домен.

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

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

Радж Барал
источник
На указанный выше вопрос это должен быть принятый ответ.
макил
14

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

winy101
источник
3
Миллиард спасибо тебе. Огромная, огромная помощь. Спасибо Спасибо спасибо. Это, я уверен, очень очевидно, но для будущих пользователей это User Id = something; Password = что - то;
shubniggurath
2
Я получал ту же ошибку в заголовке сообщения. Я обнаружил, что «User Id = yourUserid Password = yourPassword» игнорируется, если в строке подключения к базе данных указано «доверенное соединение = true». Я удалил «доверенное соединение = истина» из своей строки, и это устранило мою проблему. Этого не произошло, пока я не переместил приложение с отладки в VS 2012 на iis 8.
T3.0 04
12

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

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

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

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

Жюльен П.
источник
11

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

simonm
источник
7
Просто поймите, что это полностью изменит контекст, в котором работает приложение ASP.NET. Вместо того, чтобы работать в контексте "СЕТЕВОЙ СЛУЖБЫ" по умолчанию, он теперь будет работать в контексте пользователя, использующего приложение (например, Domain \ someUser). Иногда это нормально, но просто поймите, что это изменение не просто быстрое исправление OP и имеет другие последствия, которые могут / не могут быть желательными.
atconway
1
MSDN на <identity />
Тимоти
6

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

Настройки могут быть выполнены в Internet Information Server (IIS 7+)> Application Pools> Advanded Settings> Process Model> Identity.

Ремко
источник
4

Для меня проблема с 'DOMAIN \ MACHINENAME $' исправлена ​​путем установки DefaultApplicationPoolIdentity на NetworkService.

введите описание изображения здесь

Арсен Хачатурян
источник
3

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

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

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

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

User Instance=true

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

Сарат Аванаву
источник
2

У меня также была эта ошибка с аутентифицированным пользователем SQL Server

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

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

Арьян
источник
1

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

Тодд Болье
источник
0

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

Если он отключен, перейдите в Панель управления-> Администрирование-> Службы и найдите агент SQL Server. Щелкните правой кнопкой мыши и выберите «Свойства». В раскрывающемся списке «Тип запуска» измените значение с «Отключено» на «Автоматически».

цитата отсюда

Петров
источник
0

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

ММС
источник
0

Я столкнулся с этой проблемой, когда клиент переименовал SQL Server. Служба отчетов SQL была настроена для подключения к старому имени сервера, для которого они также создали псевдоним, перенаправленный на IP-адрес нового имени сервера.

Все их старые приложения IIS работали, перенаправляя на новое имя сервера через псевдоним. Догадываясь, я проверил, работают ли они с SSRS. Попытка подключиться к сайту SSRS привела к ошибке:

«Служба недоступна. Обратитесь к системному администратору для решения проблемы. Системные администраторы: сервер отчетов не может подключиться к своей базе данных. Убедитесь, что база данных работает и доступна. Вы также можете проверить журнал трассировки сервера отчетов для получения дополнительных сведений. . "

Он работал на сервере, но не мог подключиться, потому что использовал псевдоним для старого имени сервера. Перенастройка SSRS на использование нового имени сервера вместо старого / псевдонима исправила это.

SQLMonger
источник
0
  1. Измените идентификатор пула приложений на локальную систему
  2. В SQL Mgmt> Безопасность> Логины
    1. Найдите NT AUTHORITY \ SYSTEM, дважды щелкните
    2. Сопоставления пользователей> Проверьте свою базу данных и назначьте ей роль ниже.
    3. Не забудьте также создать базу данных пользователей о безопасности входа в систему с правильным паролем.
Аллан Зейдлер
источник
0

Я получил эту ошибку, пытаясь проверить решение, используя следующие

string cn = "Data Source=[servername];Integrated Security=true;Initial Catalog=[dbname];";

Я решил следующее: мне пришлось открыть Visual Studio и запустить ее под другой учетной записью, потому что учетная запись, которую я использовал для открытия, не была моей учетной записью администратора.

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

живи любя
источник
0

Цените здесь несколько хороших ответов, но, поскольку я только что потерял время, работая над этим, надеюсь, это может кому-то помочь.

В моем случае все работало нормально, а затем остановилось без видимой причины с ошибкой, указанной в вопросе.

IIS работал как сетевая служба, а сетевая служба была настроена на SQL Server ранее (см. Другие ответы на этот пост). Роли серверов и сопоставления пользователей выглядели правильно.

Проблема была; абсолютно без видимой причины; Сетевая служба перешла на «Запретить» права входа в базу данных.

Исправить:

  1. Откройте SSMS> Безопасность> Логины.
  2. Щелкните правой кнопкой мыши «NT AUTHORITY \ NETWORK SERVICE» и выберите «Свойства».
  3. Перейдите на вкладку «Статус» и установите Permission to Connect To Database Engine«Грант».

Сетевая служба разрешена

HockeyJ
источник
0

Добавление нового ответа здесь, потому что предыдущие ответы не объясняли мою проблему. Проблема в том, что имя пользователя, требуемое в SQL, - это ИМЯ пула приложений, а не его идентификатор. .

Я запускал IIS с AppPools, установленным для ApplicationPoolIdentityидентификации.

Вызывается мое имя пользователя безопасности SQL с доступом, IIS APPPOOL\DefaultAppPoolи оно отлично работает с .NET-приложением ASP.NET Full Framework.

При запуске моего приложения ASP.NET Core он создал новый пул приложений с именем приложения, но без версии CLR и по-прежнему с тем же ApplicationPoolIdentityидентификатором.

Но посмотрев на имя пользователя, используемое через System.Security.Principal.WindowsIdentity.GetCurrent().Name, я понял, что он использует не DefaultAppPool, а новое имя пула приложений. Поэтому мне пришлось добавить нового пользователя с именем IIS APPPOOL\ApplicationNameна вкладке безопасности SQL, а не пользователя по умолчанию.

Dunge
источник