Ошибка входа для пользователя 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? Но это то, что мне говорит одна ссылка, чтобы решить эту проблему.


Итак, напомним, вы не используете пользователя базы данных? Мы создаем один и можем переключаться между ним и 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, он заработал.


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!


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, и он работал нормально.


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


6

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

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



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 на использование нового имени сервера вместо старого / псевдонима исправила это.


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«Грант».

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


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, а не пользователя по умолчанию.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.