Почему мое приложение MVC пытается войти в мою БД в качестве моей машины, а не как идентификатор пула приложений?

Когда я пытаюсь получить доступ к моему недавно установленному (to lcoal IIS 7.5) MVC4-приложению, я получаю сообщение об ошибке:

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

где '$' добавляется, а не является частью имени машины.

Строка подключения в web.config выглядит так:

<add name="ComairRIEntities"
     connectionString="metadata=res://*/Data.ComairRI.csdl|res://*/Data.ComairRI.ssdl|res://*/Data.ComairRI.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=(local);initial catalog=MyDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;"
     providerName="System.Data.EntityClient" />

Ответ 1

Вот что происходит:

В строке подключения есть следующий параметр: интегрированная безопасность = True Это означает, что соединение SQL Server будет завершено с учетными данными процесса, который инициирует соединение. Поскольку вы работаете под IIS, а IIS использует пулы приложений, соединение будет проходить проверку подлинности с помощью пользователя Windows, который запускает пул приложений. По умолчанию это пользователь, у которого почти нет разрешений, называемых NetworkService. NetworkService (или, может быть, в IIS7.5 он другой) никогда не будет иметь права доступа к вашей базе данных. Нюансы вашего конкретного сценария могут быть немного разными, потому что в IIS есть множество разных наследований безопасности и множество разных пользователей, которые могут закончиться вашим процессом, однако основная проблема заключается в том, что у вас есть интегрированная безопасность = True, и пользователь, с которым работает IIS, является стандартным пользователем с почти никакими правами.

Чтобы исправить, у вас есть несколько вариантов:

  • Изменить интегрированную безопасность = Истинное имя пользователя\пароль. Это решит его на 100%, но вы можете не захотеть сохранить свой пароль в текстовом файле web.config.
  • В настройках виртуального каталога IIS настройте анонимного пользователя как содержательный, который имеет права доступа к вашему db. Это поможет в конечном итоге, но вам придется играть с разными настройками, чтобы все было правильно.

Если вам нужна дополнительная помощь с № 2, вы должны предоставить следующую информацию:

  • Идентификатор AppPool
  • Идентификатор виртуального каталога и все параметры проверки подлинности виртуального каталога.

Ответ 2

В этом вопросе есть много хорошей информации: Ошибка входа для пользователя DOMAIN\MACHINENAME $.

Если вы видите неудачу, например, "Ошибка входа в систему" ​​для пользователя "DOMAIN\MACHINENAME $", это означает, что процесс, выполняемый как NETWORK SERVICE или как LocalSystem, обратился к удаленному ресурсу, аутентифицировал себя как учетную запись компьютера и получил отказ в авторизации.

Кажется странным, что вы все еще пытаетесь получить доступ к локальной базе данных, но имя пользователя DOMAIN\MACHINENAME$ означает, что он обращается к нелокальной базе данных.

Вы уверены, что строка связи, которую вы опубликовали, фактически является той, которая используется?

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

Тип учетной записи пользователя будет зависеть от вашей среды: если вы работаете в домене, вы можете создать пользователя домена и продолжать использовать integrated security=True в строке подключения, или если вы не можете исследовать использование проверки подлинности SQL.

Edit:

У меня была эта точная ошибка, сделав почти то же самое. В моем случае база данных находилась на отдельном сервере (т.е. Не на том же компьютере, что и в вашем случае), но решение было следующим:

  • Создайте учетную запись домена.
  • Добавьте его в Security\Logins и Security\Users в SQL Management Studio.
  • Предоставить ему членство db_datareader и db_datawriter в SQL Management Studio.
  • На веб-сервере запустите aspnet_regiis -ga domain\account_name
  • Задайте эту учетную запись той, которая используется для анонимного доступа.
  • Создайте новый пул приложений для этого веб-приложения.
  • Задайте личность пула приложений для этой учетной записи.

Обратите внимание, что это было для IIS 6, поэтому, если вы находитесь в IIS 7+, вам могут не понадобиться шаги 4, 5 и 6.

Ответ 3

Следует отметить, что DOMAIN\MACHINE-NAME$ - это синтаксис, используемый для представления учетных данных компьютера в домене. Аналогично тому, как у вас есть учетная запись пользователя, есть также учетная запись машины, которая почти идентична (за исключением того, что разрешения значительно отличаются).

Поскольку вы получаете DOMAIN\MACHINE-NAME$, у вас нет проблемы с олицетворением. Первое, что нужно сделать, это посмотреть на пул приложений, чтобы узнать, в чем он работает.

Вы можете сделать это, открыв диспетчер IIS и выбрав "Пулы приложений". Затем выберите пул приложений и нажмите "Просмотреть приложения" справа, это позволяет проверить, что все настроено правильно.

Если он настроен правильно, нажмите "Дополнительные настройки...", в заголовке "Модель процесса" появится поле "Идентификация", оно должно быть одним из следующих:

  • ApplicationPoolIdentity
  • LocalService
  • LocalSystem
  • NetworkService
  • DOMAIN\учетная запись

Если это ApplicationPoolIdentity, он настроен так, как вы ожидаете, если он не является обычным, в противном случае вы, скорее всего, получите DOMAIN\MACHINE-NAME$, как вы переживаете. Сомнительно, что пользовательская учетная запись будет отображаться как эта учетная запись.

Если это ApplicationPoolIdentity, и машина SQL не находится на одном компьютере (или, возможно, если вы используете имя хоста или IP-адрес), вы можете получить DOMAIN\MACHINE-NAME$, поскольку это сетевые учетные данные ApplicationPoolIdentity. ApplicationPoolIdentity использует IIS AppPool\ApplicationPool для локального доступа, но DOMAIN\MACHINE-NAME$ для удаленного доступа, поскольку первый доступен только локально.

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

Если это не решит проблему, это поможет, если вы подробно расскажете о том, какой идентификатор вы установили, и включена ли олицетворк ASP.Net.

Ответ 4

Вы уверены, что этот бит должен иметь "

  provider connection string=&quot

Должен ли это быть просто знак кавычки, как в остальной части строки?

В конце строки есть и один.

Ответ 5

Что локальная учетная запись пользователя, что идентификатор пула приложений проявляется, как при подключении к SQL Server. Попробуйте либо изменить пул приложений, чтобы использовать сетевую службу, либо предоставить разрешение на сетевую службу для своей базы данных, либо предоставить разрешение IUSR_YOUR-MACHINE базе данных. По мере того, как вы работаете локально, может быть проще сделать сетевую службу db_owner вашей локальной базы данных. Очевидно, что есть проблемы с безопасностью при этом в производстве!

Ответ 6

Проверьте личность приложения AppPool для вашего приложения в диспетчере IIS. Вероятно, это будет AppPoolIdentity. Затем проверьте, что вы создали логин в SQL Server для этого удостоверения, который он сопоставлен с вашей базой данных и что он имеет необходимые членства/разрешения для доступа, необходимые для приложения. Идентификатор будет "IIS AppPool\[AppPoolName]". (Подробнее см. http://www.iis.net/learn/manage/configuring-security/application-pool-identities.

Если это не сработает, объясните, как настроено подключение к базе данных вашего приложения, в том числе, включено ли олицетворение.

Ответ 7

Я рассмотрю следующее.

Вместо "источника данных = (локальный)" используйте имя компьютера, в котором находится база данных. Проверьте правильность разрешения DNS.

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