Ошибка входа для пользователя 'IIS APPPOOL \ ASP.NET v4.0'

432

У меня есть веб-проект (C # Asp.Net, EF 4, MS SQL 2008 и IIS 7), и мне нужно перенести его на IIS 7 локально (на данный момент отлично работает с CASSINI).

Локально в IIS у меня есть Default Web Siteмой развернуть. Как мое развертывание, так и Default Web Siteпул ASP.NET v4.0 (см. Изображение для настройки) целевой пул Framework 4 в качестве моего веб-проекта. Настройки бассейна При посещении сайта браузер не показывает страницу и позволяет браузеру загружать страницу.

У меня есть другие проекты, работающие на IIS локально, и они работают без проблем (но они не используют Entity Framework).

Используя Event Logger, я вижу ошибки, как показано ниже:

Exception information: 
    Exception type: EntityException 
    Exception message: The underlying provider failed on Open.
   at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure)


    Login failed for user 'IIS APPPOOL\ASP.NET v4.0'.
       at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
       at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
       at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
       at System.Data.SqlClient.SqlConnection.Open()
       at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure)

Связанный вопрос

ОБНОВЛЕНИЕ: Вы можете прочитать в ресурсах по этому вопросу, что разрешения должны быть предоставлены на MS SQL 2008 вручную, как объясняется в его ответе. При использовании IIS 7.5 и MS SQL 2008 R2 установка разрешения вручную не требуется.

GibboK
источник
2
Вы разрешили разрешение на идентификацию пула приложений в папке сайта?
Кристиан
я не уверен, не могли бы вы сказать мне, как это сделать?
GibboK
на самом деле, как говорит Adrift, это может быть проблемой безопасности SQL. Лучше всего установить учетную запись пользователя NT для AppPool, а затем предоставить это разрешение для папки веб-сайта и соответствующих таблиц в SQL
Christian
1
@GibboK: Я бы посоветовал вам ознакомиться с принятым здесь ответом и выбрать более подходящий ответ. Принятый ответ ведет многих людей в черную дыру безопасности. Да, это работает. Нет, это действительно не очень хорошая идея. Смотрите мои комментарии ниже.
спонсор

Ответы:

596

Похоже, не удается открыть соединение с SQL Server.

Вам необходимо добавить имя входа в SQL Server для IIS APPPOOL\ASP.NET v4.0и предоставить разрешения для базы данных.

В SSMS под сервером разверните Security, затем щелкните правой кнопкой мыши Logins и выберите «New Login ...».

В диалоговом окне «Новый вход в систему» ​​введите пул приложений в качестве имени для входа и нажмите «ОК».

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

Затем вы можете щелкнуть правой кнопкой мыши логин для пула приложений, выбрать «Свойства» и выбрать «Сопоставление пользователей». Проверьте соответствующую базу данных и соответствующие роли. Я думаю, что вы можете просто выбрать db_datareaderи db_datawriter, но я думаю, что вам все равно нужно предоставить разрешения для выполнения хранимых процедур, если вы делаете это через EF. Вы можете проверить детали для ролей здесь .

Джефф Огата
источник
8
спасибо, я сделал то, что тебе грустно, теперь я получаю эту ошибку: Не могу открыть базу данных "SiteNameExtension", запрошенную логином. Ошибка входа. Ошибка входа для пользователя 'IIS APPPOOL \ DefaultAppPool'.
GibboK
76
ОЧЕНЬ ВАЖНО: НЕ НАЖИМАЙТЕ ПОИСК, ЧТОБЫ ПОПРОБОВАТЬ, ЧТОБЫ ПОДТВЕРДИТЬ ЛОГИН! Это не признает, но это будет работать. Просто введите его как IIS APPPOOL \ SimonsAppPoolName. Посмотреть этот stackoverflow.com/questions/1933134
Simon_Weaver
6
Вместо этого лучше изменить «Identity» на «LocalSystem» из IIS, как описано в следующем ответе.
Альтаф Патель
Может ли это работать, когда ваш экземпляр SQL-сервера находится на другом хост-компьютере, чем ваш хост-компьютер IIS? Потому что мне нужно исправить ту же проблему, но SQL и IIS не на одной машине. Таким образом, использование аутентификации Windows для этого нового пользователя не будет работать
Segers-Ian
5
Для меня пользователь добавил «IIS APPPOOL \ DefaultAppPool». Тогда это сработало.
Марсель
343

Вы можете изменить ApplicationPoolIdentity из IIS7 -> Пулы приложений -> Расширенные настройки. Расширенные настройки

Под ApplicationPoolIdentity вы найдете локальную систему. Это позволит запустить ваше приложение NT AUTHORITY\SYSTEM, которое по умолчанию является существующим логином для базы данных.

Изменить: Перед применением этого предложения вы должны отметить и понять последствия для безопасности.

Теа
источник
51
@ GibboK, если вы беспокоитесь о безопасности, не делайте этого. См. Technet.microsoft.com/en-us/library/dd378907(v=WS.10).aspx
Джефф Огата
4
В дополнение к запуску пула приложений в качестве идентификатора LocalSystem мне также пришлось сопоставить пользователя «NT AUTHORITY \ SYSTEM» с ролями базы данных
Фил
31
Это воняет. Предоставление полномочий СИСТЕМЫ веб-приложению - это путь к катастрофе и дает злоумышленникам всевозможные возможности нанести вред не только вашему веб-приложению, но и всему хост-серверу. То, что БД принимает логины от SYSTEM, не означает, что вы должны запускать ваше веб-приложение как SYSTEM. Рабочий стол Windows даже не позволит вам работать как система (без прыжков через обручи). Запуск веб - приложение с этим органом является действительно, действительно глупая идея. Вы должны заставить БД принять текущую идентификационную информацию apppool. Я бы -100, если бы мог. -1.
спонсор
8
СИСТЕМА имеет больше привилегий, чем администратор. Вы НИКОГДА не должны запускать свой веб-сервер с чем-либо приближающимся к этому уровню.
Слагстер
1
Я просто делаю гостевую учетную запись членом группы администраторов. Просто, чисто, никогда не возникает проблем с безопасностью.
29

убедитесь, что у вас есть ...

Trusted_Connection=false;

в вашей связи String

JGilmartin
источник
7
Если в строке подключения указано значение Trusted_Connection = true, значения аутентификации SQL будут переопределены профилем пользователя IIS Identity.
Джефф Медведь
2
в моем случае удаление: Integrated Security = True из строки подключения исправлено.
Карлос Р Балебона
Работал на меня. Спас день @JefftheBear
D_Edet
26

Я решил эту проблему, используя sql следующим образом.

Щелкните правой кнопкой мыши db-> properties -> разрешение -> Просмотреть разрешение сервера ->, а затем выберите IIS APPPOOL\ASP.NET v4.0и предоставьте разрешение.

децибел

DevT
источник
Является ли описанный выше процесс (и изображение), который вы описываете, предоставляя разрешения уровня сервера для этой идентификации пула приложений? Не похоже на хорошую идею.
Крис Уолш
2
Этот пользователь заслуживает медали! Ничего не помогло, кроме этого!
Khateeb321
2
@ Khateeb321 абсолютно, большое спасибо DevT за твой ответ.
Azxdreuwa
22

Запустите этот сценарий SQL

IF NOT EXISTS (SELECT name FROM sys.server_principals WHERE name = 'IIS APPPOOL\DefaultAppPool')
BEGIN
    CREATE LOGIN [IIS APPPOOL\DefaultAppPool] 
      FROM WINDOWS WITH DEFAULT_DATABASE=[master], 
      DEFAULT_LANGUAGE=[us_english]
END
GO
CREATE USER [WebDatabaseUser] 
  FOR LOGIN [IIS APPPOOL\DefaultAppPool]
GO
EXEC sp_addrolemember 'db_owner', 'WebDatabaseUser'
GO
Ролвин Крэста
источник
Спасибо, самый простой способ;) +1
Zolfaghari
11

Если в строке подключения вы указали:

User ID=xxx;Password=yyy

но в строке подключения есть:

Trusted_Connection=true;

SQL Server будет использовать проверку подлинности Windows, поэтому значения вашего подключения будут игнорироваться и переопределяться (IIS будет использовать учетную запись Windows, указанную в профиле пользователя Identity). больше информации здесь

То же самое относится, если в строке подключения есть:

 Integrated Security = true;

или

 Integrated Security = SSPI;

потому что проверка подлинности Windows будет использоваться для подключения к серверу базы данных. больше информации здесь

человек-паук
источник
10

Зайдите в iis -> пулы приложений -> найдите пул приложений, используемый в приложении

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

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

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

Выберите удостоверение пула приложений введите описание изображения здесь

выберите встроенную локальную систему и нажмите кнопку ОК

Lijo
источник
7

Я ненавижу ApplicationPoolIdentity. Я всегда устанавливаю учетную запись пользователя Windows в качестве учетной записи на AppPools.

Как говорит дрейф, это звучит как проблема безопасности базы данных. Поэтому создайте учетную запись пользователя NT, назначьте ее для ASP.NET v4.0 AppPool, а затем предоставьте ей разрешение на папку веб-сайта и соответствующие таблицы в SQL.

Кристиан
источник
извините, не знаю, как это сделать, не могли бы вы указать мне учебник? спасибо за вашу помощь в этом
GibboK
2
Не делайте этого, есть причина, по которой IIS изменил удостоверение пула приложений, learn.iis.net/page.aspx/624/application-pool-identities
Жюльен Лебо,
@ LeSnip3R сломанной ссылке
Adaptabi
6

Не используйте встроенную безопасность. использованиеUser Id=yourUser; pwd=yourPwd;

Это решает проблему.

bonh
источник
4

У меня была эта проблема, и она была вызвана чем-то другим - в моей базе данных был пользователь «IIS APPPOOL \ ASP.NET v4.0», но он все еще не работал.

Я недавно обновил установку SQL Server, и в процессе работы пользователь отключился от входа в систему - поэтому в разделе «База данных» - «IIS APPPOOL \ ASP.NET v4.0» -> Безопасность -> Пользователи, НО пользователь не находится под защитой -> Логины.

Добавлен логин IIS APPPOOL \ ASP.NET v4.0 в Security -> Logins, SQL Server автоматически сопоставил его с пользователем в базе данных (раньше это делалось вручную) и проблема была устранена.

Кодер
источник
1
просто чтобы добавить ... в левой части, под разрешениями ... отметьте db_writer и db_reader; и выберите базу данных, которая будет использовать эти разрешения.
Бенджиб
4

Первое, что вам нужно очистить, если вы используете проверку подлинности Windows и не упоминаете пароль пользователя в строке подключения, тогда:

Что происходит, когда вы запускаете код через localhost: когда вы запускаете тестовый клиент wcf с localhost, он сможет обмениваться данными с базой данных, так как приложение в режиме локальной отладки вызывает базу данных службой вашей учетной записи. Так что он имеет доступ к базе данных, потому что devenv.exe работает под вашей учетной записью.

Но когда вы развертываете свой веб-сервис в IIS. Теперь поймите, этот сервис работает под IIS, а не под вашей учетной записью. Поэтому вам необходимо назначить права доступа к службе IIS для доступа к серверу sql для проверки подлинности Windows. Здесь ваш веб-сервис не сможет обмениваться данными с сервером SQL из-за проблем с правами доступа и с ошибкой входа для пользователя _______ (сюда придет ваш пользователь)

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

Ниже приведены шаги для проверки подлинности Windows WCF:

1) Откройте IIS (Windows + R (запустить), затем введите inetmgr, затем нажмите ОК)

2) дважды щелкните имя вашего ПК в разделе «Подключения»

3) Нажмите Пулы приложений.

4) Выберите пул приложений (DefaultAppPool)

5) Затем в разделе «Действия» справа щелкните «Дополнительные параметры»:

6) Перейдите в раздел Модель процесса и

7) нажмите на личность.

8) Теперь выберите LocalSystem.

Теперь откройте свою студию управления сервером sql: откройте run->, затем введите ssms ->, затем нажмите ok. В ssms войдите, используя свою учетную запись для аутентификации Windows. Откройте вкладку «Безопасность», откройте вкладку «Вход», после чего вы сможете просмотреть свою учетную запись.

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

(Для сетевых служб, т. Е. Для пользователей в интрасети, вам также необходимо настроить вышеуказанные параметры для пользователя NT AUTHORITY \ SYSTEM)

add Trusted_Connection = True; свойство в строке подключения. Сохраните его и разверните веб-сервис. Перезапустите пул приложений.

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

Амар Гадекар
источник
Отлично! LocalSystem исправил эту проблему для меня :)
тоталитарный
3

У меня было это сообщение, и я использую проверку подлинности Windows на веб-сервере.

Я хотел, чтобы аутентифицированный в настоящее время веб-пользователь проходил аутентификацию в базе данных, а не с использованием пользователя IIS APPPOOL \ ASP.NET v4, указанного в пуле приложений.

Я нашел, введя следующее в web.config, исправил это для меня:

<system.web>
  <identity impersonate="true" />
</system.web>

https://msdn.microsoft.com/en-us/library/bsz5788z.aspx

Я вижу другие ответы, касающиеся создания имени пользователя AppPool в базе данных SQL или просто использования аутентификации SQL. И то, и другое будет правильным, если вы не хотите захватывать или защищать отдельных пользователей Windows внутри SQL.

Том

tommylux
источник
Это решило это для нас, и мы не уверены, почему. IIS / AppPool просто перехватывает строку подключения, в которой явно указано «Integrated Security = true»? Почему??
Парень
3

1_in SqlServer Security => Логин => NT AUTHORITY \ SYSTEM => RightClick => Property => UserMaping => Выбрать YourDatabse => Общий && Выбор владельца => OK 2_В IIs Пулы приложений DefaultAppPool => Дополнительные настройки => Identity => LocalSystem => Ok

mehranSattary
источник
2

Установка идентичности только делает эту работу на моих страницах.

Чарльз
источник
2

Cassini запускает ваш веб-сайт под вашим собственным именем пользователя при запуске приложения Visual Studio. IIS управляет вашим сайтом как удостоверение пула приложений. Если у удостоверения пула приложений нет доступа к базе данных, вы получите ошибки.

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

В сетевых ситуациях (которых нет в Azure) вы можете запустить новый пул приложений под учетной записью пользователя домена Active Directory; Я предпочитаю это за счет машины. Это обеспечивает детальную безопасность и детальный доступ к сетевым ресурсам, включая базы данных. Каждый веб-сайт работает в отдельном пуле приложений (и каждый из них работает под своей учетной записью пользователя домена).

Продолжайте использовать встроенную безопасность Windows во всех строках подключения. В SQL Server добавьте пользователей домена в качестве учетных записей и предоставьте разрешения для баз данных, таблиц, SP и т. Д. Для каждого веб-сайта. Например, DB1, используемый Website1, имеет логин для User1, поскольку Website1 работает в пуле приложений как User1.

Одна из проблем, связанных с развертыванием встроенной БД Visual Studio (например, LocalDB) и встроенного веб-сервера в производственной среде, связана с тем, что SID пользователя разработчика и его ACL не должны использоваться в безопасной производственной среде. Microsoft предоставляет инструменты для развертывания. Но пожалейте бедного разработчика, который привык ко всему, просто работает из коробки в новой простой VS IDE с localDB и localWebServer, потому что эти инструменты будут трудно использовать для этого разработчика, особенно для такого разработчика, у которого нет поддержки SysAdmin и DBAdmin или их специализированные знания. Тем не менее развертывание в Azure проще, чем описанная выше ситуация в корпоративной сети.

subsci
источник
2

Если в вашем файле web.config добавлена ​​строка подключения, убедитесь, что «Integrated Security = false;» поэтому он будет использовать идентификатор и пароль, указанные в файле web.config.

<connectionStrings>
    <add providerName="System.Data.SqlClient" name="MyDbContext" connectionString="Data Source=localhost,1433;Initial Catalog=MyDatabase;user id=MyUserName;Password=MyPassword;Trusted_Connection=true;Integrated Security=false;" />
</connectionStrings>
Daming Fu
источник
2

Как указано, не используйте проверку подлинности Windows, используйте проверку подлинности SQL Server

Также, если вы создали соединение с помощью диалога «Соединение с сервером», обязательно проверьте соединения в web.config. Вероятно, вы создали / изменили соединение, и оно было сохранено как доверенное соединение в web.config. Просто используйте эту аутентификацию

<add name="MyDBConnectionString" connectionString="Data Source=localhost;Initial Catalog=Finantial;User ID=xxx;Password=xxx" providerName="System.Data.SqlClient"/>

который должен исправить ошибку.

Хаммад хан
источник
2

Другой способ предоставления пользователю доступа к базе данных IIS APPPOOL\ASP.NET v4.0заключается в следующем.
введите описание изображения здесь


  1. Добавьте нового пользователя с именем пользователя и именем входа, как в IIS APPPOOL\ASP.NET v4.0вашей схеме по умолчанию.
  2. Перейти к схеме владельца и членству, проверить db_datareader, db_datawriter
Шана
источник
1

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

Это же сообщение появляется и в том случае, если база данных не существует!

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

colmde
источник
1

У меня та же проблема, я решил ее, изменив Integrated Security=Trueна ложное, теперь оно работает

subramanya46
источник
1

что-то похожее случилось со мной, и мне удалось изменить свойство Integrated Security = True на Integrated Security = false в web.config веб-сайта.

Эрик Родригес
источник
это работает! Я только что снял встроенную защиту
Чарльз Ксавье
0

Вы сделали то , что @Teddyрекомендуется , и вы STILL получить ту же ошибку?

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

Simon_Weaver
источник
0

В DefaultAppPool установите NetworkService в свойстве Identity, а в Sql Server добавьте User Network Service и предоставьте ему соответствующие разрешения для вашей базы данных, это очень хорошо работает для меня, я тестировал локально, но я думаю, что это лучшая конфигурация для подключения из любого другой компьютер в сети. когда вы устанавливаете LocalSystem в Identity в IIS, это работает хорошо, и нет необходимости создавать какого-либо другого пользователя в Sql Server, но я думаю, что это не будет работать в сетевой среде.

Луис
источник
0

Я столкнулся с той же проблемой тестирования ASP.NET Web API

Разработка Web.Host в Visual Studio 2013 Express База данных, созданная в SQL Server 2012 Express Выполнение теста с использованием встроенного IIS Express (работает) Изменено для использования IIS Local (со страницы свойств - веб-опция) Выполнено тестирование с ошибкой Fiddler Received - невозможно открыть базу данных для провайдера .... со ссылкой 'APPPOOL \ DefaultAppPool'

Решение, которое сработало.

В IIS

Нажмите на пул приложений «DefaultAppPool». Set Identify = «ApplicationPoolIdentity». Установите .NET framework = v4.0 (хотя мое приложение было 4.5)

В SQL Server Management Studio

Щелкните правой кнопкой мыши на папке «Безопасность» (в ядре SQL Server, что относится ко всем таблицам). Щелкните правой кнопкой мыши на «Пользователь» и добавьте «IIS APPPOOL \ DefaultAppPool». В столбцах «Доступные» в столбце «Предоставить» отметьте параметры, которые вы хотите предоставить. Что касается вышесказанного, если вы являетесь администратором базы данных, вы, вероятно, знаете и хотите контролировать, что это за опции. Если вы похожи на меня, разработчик просто хотел протестировать ваш сервис веб-API, который также обеспечивает доступ к SQL Server через EF 6 в стиле MVC, тогда просто отметьте все. :) Да, я знаю, но это сработало.

Брайан Куинн
источник
0

Если вы добавляете новый логин, убедитесь, что в свойствах сервера (rightclick -> properties) / security режим аутентификации установлен как для sqlserver, так и для окон, а не только для окон.

Бадр Слауи
источник
0

Добавить «Все» под защитой. Если вы добавили Сервер и пользователи вошли в базу данных, то вам этого не хватает. Надеюсь это поможет.

авинава басу
источник
Мы устанавливаем разрешения в соответствии с нашими потребностями. Часть аутентификации обрабатывается, и мы проверяем авторизацию с помощью кода, чтобы разрешить доступ. Не стесняйтесь поправлять меня, если вы чувствуете какую-то двусмысленность. Спасибо.
Авинава Басу
0

Для записи, если вы столкнетесь с этой ошибкой после переключения с LocalDBна SQLEXPRESS, убедитесь, что база данных уже существует SQLEXPRESS. Вы можете проверить это в Management Studio.

У меня была такая же проблема при использовании Entity Frameworkпосле переключения на SQLEXPRESS from LocalDB. Я должен был управлять Update-Databaseкомандой. Я смог успешно подключиться после этого.

Irshu
источник
0

Я сделал именно так, как сказал @JeffOgata, но получил ошибку:

Windows NT user or group 'IIS APPPOOL\ASP.NET v4.0' not found. Check the name again. (Microsoft SQL Server, Error: 15401)

Я снова посмотрел на свое сообщение об ошибке и там было сказано Login failed for user 'IIS APPPOOL\DefaultAppPool'.

После добавления пользователя с именем IIS APPPOOL\DefaultAppPoolвсе работает.

Ogglas
источник
0

Я использовал SQL Server Profiler (доступен в меню SSMS => Сервис) и увидел там (когда IIS пытался подключиться к базе данных), что мой пользователь IIS по какой-то причине был NT AUTHORITY \ IUSR, независимо от всех шагов, рекомендуемых в ответах на этот вопрос , Поэтому я добавил этого пользователя в SQL Server, и это сработало ...

alexkovelsky
источник
0

В веб-форме Asp.net,

эта ошибка исправлена ​​при установке asp.net из:

Диспетчер серверов> Управление> Добавить роль и компонент> Роли сервера> Веб-сервер (IIS)> Веб-сервер> Разработка приложений> ASP.NET 3.5 / 4.6 установлен.

моя проблема исправлена.

Zolfaghari
источник