Помилка входу для користувача "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 Framework 4 як мій веб-проект. Налаштування басейну Під час відвідування сайту браузер не відображає сторінку та дозволяє браузеру завантажувати її замість цього.

У мене є інші проекти, які працюють на IIS локально, і вони працюють без проблем (але вони не використовують Entity Framework).

Використовуючи Журнал подій, я бачу помилки, як показано нижче:

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 MS SQL 2008 мають бути надані вручну, як швидко пояснити його відповідь. Використовуючи IIS 7.5 та MS SQL 2008 R2, встановлювати дозвіл вручну не потрібно.


2
Ви дозволили дозвіл ідентифікації пулу додатків у папці веб-сайту?
Крістіан

я не впевнений, чи не могли б ви сказати мені, як це зробити?
GibboK


насправді, як каже Adrift, це може бути проблемою безпеки sql. Найкраще встановити обліковий запис користувача NT для AppPool, а потім надати цей дозвіл папці веб-сайту та відповідним таблицям у SQL
Christian

1
@GibboK: Я б закликав вас переглянути прийняту відповідь тут і вибрати більш відповідну відповідь. Прийнята відповідь призводить багатьох людей до чорної діри в безпеці. Так, це працює. Ні, це насправді не дуже гарна ідея. Дивіться мої коментарі нижче.
витрачається

Відповіді:


596

Схоже, це не вдалося спробувати відкрити з'єднання з SQL Server.

Вам потрібно додати логін до SQL Server для IIS APPPOOL\ASP.NET v4.0та надати дозволи до бази даних.

У SSMS під сервером розгорніть Захист, потім клацніть правою кнопкою миші Логін та виберіть "Новий вхід ...".

У діалоговому вікні Новий вхід введіть пул додатків як ім’я для входу та натисніть «ОК».

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

Потім можна клацнути правою кнопкою миші логін для пулу додатків, вибрати властивості та вибрати "Картографування користувача". Перевірте відповідну базу даних та відповідні ролі. Я думаю, ви можете просто вибрати 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" на ролі бази даних
Phil

31
Це смердить. Надання веб-додатку SYSTEM повноважень - це рецепт стихійних лих і дозволяє зловмисникам усілякі можливості завдати шкоди не тільки вашому веб-додатку, але й усім серверам хостингу. Тільки тому, що БД приймає входи з системи SYSTEM, не означає, що ви повинні запускати веб-додаток як SYSTEM. Робочий стіл Windows навіть не дозволить вам працювати як СИСТЕМА (без стрибків через обручі). Запуск Webapp з цим авторитетом - це справді, дуже дурна ідея. Ви повинні змусити БД прийняти поточну особу програми. Я б -100, якби міг. -1.
витрачати

8
СИСТЕМА більш привілейована, ніж адміністратор. НІКОЛИ не слід запускати веб-сервер нічим, що наближається до цього рівня.
Slugster

1
Я просто роблю гостьовий акаунт членом групи адміністратора. Простий, чистий, ніколи не мати проблем із фігнями безпеки.

29

переконайтеся, що у вас є ...

Trusted_Connection=false;

у вашому з'єднанні String


7
Якщо Trusted_Connection = true у рядку з'єднання буде замінено значення аутентифікації SQL з профілем користувача IIS Identity.
Ведмідь Джефф

2
у моєму випадку видалення: Integrated Security = True із рядка з'єднання виправлено це.
Карлос Р Балебона

Працювали для мене. Врятував день @JefftheBear
D_Edet

26

Я вирішив цю проблему, використовуючи sql як наступне зображення.

Клацніть правою кнопкою миші на db-> властивості -> дозвіл -> Перегляд дозволу сервера -> та виберіть IIS APPPOOL\ASP.NET v4.0та надайте дозвіл.

дб


Чи є описаний вище процес (та зображення), який ви описуєте дозволом GRANTing на рівні сервера до цієї ідентичності пулу додатків? Це не здається гарною ідеєю.
Кріс Уолш

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 -> пулів додатків -> знайдіть пул додатків, який використовується у програмі

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

виберіть пул додатків, який використовується для програми, клацніть правою кнопкою миші виберіть розширені налаштування

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

Виберіть ідентифікацію пулу програм введіть тут опис зображення

виберіть вбудовану локальну систему та натисніть кнопку ОК


7

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

Як каже Adrift, це звучить як проблема безпеки бази даних. Отже, створіть обліковий запис користувача NT, призначте його ASP.NET v4.0 AppPool та надайте йому дозвіл у папці веб-сайту та у відповідній таблиці (таблицях) SQL.


вибачте, не маю уявлення, як це зробити, чи не могли б ви вказати мені підручник? дякую за допомогу з цього
приводу

2
Не робіть цього, є причина, чому IIS змінив ідентифікацію пулу додатків, learn.iis.net/page.aspx/624/application-pool-identities
Жульєн Лебот

@ LeSnip3R сломанной посиланням
Adaptabi

6

Не використовуйте інтегровану безпеку. ВикористовуйтеUser Id=yourUser; pwd=yourPwd;

Це вирішує проблему.


4

У мене була ця проблема, і її насправді викликало щось інше - у мене в базі даних був користувач 'IIS APPPOOL \ ASP.NET v4.0', але він все ще не працював.

Нещодавно я оновив інсталяцію SQL Server і в процесі користувач відключився від входу в систему, тому в базі даних -> Безпека -> Користувачі, АМО немає, користувач не знаходиться під захистом -> Логіни.

Додано увійти 'IIS APPPOOL \ ASP.NET v4.0' до Безпеки -> Логіни, SQL Server автоматично відобразив його в Користувача в базі даних (це потрібно було робити вручну) та усунув проблему.


1
просто додати ... ліворуч, під Дозволом ... позначте db_writer та db_reader; і виберіть базу даних, яка використовуватиме ці дозволи.
benjieb

4

Перше, що вам потрібно буде зрозуміти, якщо ви використовуєте автентифікацію Windows, і ви не згадуєте жодного пароля імені користувача у рядку з'єднання, а потім:

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

Але коли ви розгортаєте веб-службу в IIS. Тепер зрозумійте, що ця послуга працює під IIS, а не за вашим обліковим записом. Отже, вам потрібно призначити права доступу службі IIS для доступу до сервера sql для аутентифікації Windows. Тут ваша веб-служба не зможе спілкуватися з SQL-сервером через проблеми з правами доступу та входу не вдалося користувачеві_______ (сюди прийде ваш користувач)

Отже, якщо ви використовуєте автентифікацію Windows для підключення бази даних, вам просто потрібно змінити налаштування пулу додатків IIS. Потрібно змінити ідентичність пулу додатків IIS на локальну Систему.

Нижче наведено кроки для WindowsF аутентифікації WCF:

1) Відкрийте IIS (windows + R (run), потім введіть inetmgr, потім натисніть кнопку OK)

2) двічі клацніть ім’я вашого ПК у розділі Підключення

3) Клацніть пули програм

4) Виберіть пул додатків (DefaultAppPool)

5) Потім під дією праворуч натисніть Розширені налаштування:

6) Перейдіть до розділу Модель обробки та

7) натисніть на Ідентичність.

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

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

Тепер відкрийте властивості свого облікового запису, перейдіть до userMapping, потім виберіть базу даних, до якої потрібно підключитися, а потім перевірте послуги рольового членства, які ви хочете використовувати для вибраної бази даних. натисніть ОК.

(Для мережевих служб, тобто користувачів внутрішньої мережі, потрібно налаштувати вищевказані налаштування і для користувача NT AUTHORITY \ SYSTEM)

додати 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 Auth. І те й інше було б правильно, якщо ви не хочете захоплювати або захищати окремих користувачів Windows всередині SQL.

Том


Це вирішило це для нас, і ми не впевнені, чому. IIS / AppPool просто викрадає з'єднання, на якому прямо написано "Інтегрована безпека = вірно"? Чому ??
Хлопець

3

1_in SqlServer Security => Вхід => NT AUTHORITY \ SYSTEM => RightClick => Properties => UserMaping => Select YourDatabse => Public && Owner Select => OK 2_In IIs Pools застосунків DefaultAppPool => Попереднє налаштування => Identity => LocalSystem => Ok


2

Встановлення ідентичності лише робить цю роботу на моїх сторінках.


2

Під час запуску програми Visual Studio Cassini запускає ваш веб-сайт як власну особу користувача. 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 простіше, ніж ситуація з мережею підприємств, згадана вище.


2

Якщо у вашому web.config додано рядок підключення, переконайтесь, що "Інтегрована безпека = хибна;" тож він буде використовувати ідентифікатор та пароль, вказані в 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>

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

Думав, що я опублікую це як відповідь, оскільки це стосується питання, і я можу відповісти на нього в деяких випадках.

Це ж повідомлення з’являється також, якщо бази даних не існує!

Переконайтеся, що у рядку з'єднання відсутні помилки, вказується на правий екземпляр сервера тощо.


1

У мене є та сама проблема, яку я вирішив, змінивши Integrated Security=Trueна хибну зараз її роботу


1

зі мною трапилось щось подібне, що для мене працювало, це змінити властивість Integrated Security = True на інтегровану безпеку = false в web.config веб-сайту


це працює! Я щойно зняв інтегровану безпеку
Чарльз Ксав'є

0

Ви зробили те, що @Teddyрекомендували, і ВИ ВЖЕ отримаєте таку ж помилку?

Переконайтеся, що ви змінюєте налаштування пулу додатків, який відповідає вашій віртуальній директорії, а не батьківському серверу. Кожен віртуальний каталог має власний AppPool і не успадковує.


0

У DefaultAppPool встановіть NetworkService у властивості Identity та на сервері Sql додайте службову мережу користувача та надайте їй відповідні дозволи до вашої бази даних, для мене це дуже добре працює, я перевірив локально, але я думаю, що це найкраща конфігурація для підключення з будь-якого інший комп'ютер у мережі. коли ви встановлюєте LocalSystem в Identity в IIS, це працює добре, і не потрібно створювати будь-якого іншого користувача на сервері Sql, але я думаю, що це не буде працювати в мережевому середовищі.


0

Я зіткнувся з тією ж проблемою, перевіряючи веб-API ASP.NET

Розроблена Web.Host в Visual Studio 2013 Express Database створена в SQL Server 2012 Express Виконаний тест за допомогою вбудованого IIS Express (працює) Модифіковано для використання IIS Local (на сторінці властивостей - веб-опція) Тест ранжування з Fiddler Отримана помилка - неможливо відкрити базу даних для постачальника .... з посиланням на "APPPOOL \ DefaultAppPool"

Рішення, яке спрацювало.

У IIS

Клацніть на пулі програм 'DefaultAppPool' Set Set Identify = 'ApplicationPoolIdentity' Set .NET Framework = v4.0 (навіть якщо в моєму додатку було 4,5)

У студії управління SQL Server

Клацніть правою кнопкою миші на папці Безпека (під двигуном SQL Server так застосовується до всіх таблиць) Клацніть правою кнопкою миші на Користувача та додайте "IIS APPPOOL \ DefaultAppPool" У захисних колах у стовпці "Грант" перевірте параметри, які потрібно надати. Щодо вищезазначеного, якщо ви DBA, ви, напевно, знаєте і хочете контролювати, які ці варіанти. Якщо ви схожий на мене, розробник просто хотів перевірити послугу WEB API, яка також може отримати доступ до SQL Server через EF 6 у стилі MVC, тоді просто перевірте все. :) Так, я знаю, але це спрацювало.


0

Якщо ви додасте новий логін, переконайтеся, що під властивостями сервера (клацніть правою кнопкою миші -> властивості) / безпекою режим автентифікації встановлено як для sqlserver, так і для Windows, а не лише для Windows.


0

Додайте "Усі" під безпеку. Якщо ви додали Сервер та користувачів, які входять у базу даних, то цього вам не вистачає. Сподіваюсь, це допомагає.


Ми встановлюємо дозволи відповідно до наших потреб. Частина аутентифікації обробляється і ми перевіряємо авторизацію за допомогою коду, щоб дозволити доступ. Не соромтеся виправляти мене, якщо відчуваєте якусь неоднозначність. Дякую.
avinava basu

0

Для запису, якщо ви виявили цю помилку після переходу LocalDBна SQLEXPRESS, переконайтеся, що база даних вже існуєSQLEXPRESS . Це можна підтвердити в студії управління.

У мене була така ж проблема при використанні Entity Frameworkпісля переходу на SQLEXPRESS from LocalDB. Мені довелося запускати Update-Databaseкоманду. Після цього я зміг успішно з'єднатися.


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все працювало.


0

Я використав Profiler SQL Server (доступний у меню SSMS => Інструменти) і там побачив (коли IIS намагався підключитися до бази даних), що мій користувач IIS чомусь був NT AUTHORITY \ IUSR, незалежно від усіх кроків, рекомендованих у відповідях на це запитання. . Тому я додав цього користувача до SQL Server, і він працював ...


0

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

ця помилка виправлена ​​під час встановлення asp.net з:

Менеджер сервера> Управління> Додати ролі та функції> Ролі сервера> Веб-сервер (IIS)> Веб-сервер> Розробка додатків> Встановлено ASP.NET 3.5 / 4.6.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.