Accesso non riuscito per l'utente "IIS APPPOOL \ ASP.NET v4.0"


432

Ho un progetto web (C # Asp.Net, EF 4, MS SQL 2008 e IIS 7) e devo migrarlo su IIS 7 localmente (al momento funziona bene con CASSINI).

A livello locale in IIS ho il mio Default Web Sitecon la mia distribuzione. Sia la mia distribuzione sia Default Web Siteil pool ASP.NET v4.0 (vedi immagine per impostazioni) il pool target Framework 4 come mio progetto web. Impostazioni piscina Quando si visita il sito, il browser non mostra la pagina e consente invece al browser di scaricare la pagina.

Ho altri progetti in esecuzione su IIS localmente e funzionano senza problemi (ma non usano Entity Framework).

Utilizzando l'Event Logger vedo gli errori come di seguito:

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)

Domanda correlata

AGGIORNAMENTO: È possibile leggere nelle risorse su questa domanda che le autorizzazioni devono essere concesse manualmente su MS SQL 2008 come spiegato alla deriva nella sua risposta. Utilizzando IIS 7.5 e MS SQL 2008 R2, l'impostazione dell'autorizzazione manuale non dovrebbe essere necessaria.


2
hai autorizzato l'autorizzazione all'identità del pool di app nella cartella del sito Web?
Christian,

non sono sicuro, potresti dirmi come si fa?
GibboK,


in realtà, come dice alla deriva, questo potrebbe essere un problema di sicurezza sql. È consigliabile impostare un account utente NT per AppPool e quindi concedere tale autorizzazione alla cartella del sito Web e alle tabelle appropriate in SQL
Christian

1
@GibboK: ti incoraggio a rivedere la risposta accettata qui e a scegliere una risposta più appropriata. La risposta accettata sta portando molte persone in un buco nero di sicurezza. Sì funziona. No, non è davvero una buona idea. Vedi i miei commenti qui sotto.
spender

Risposte:


596

Sembra che non stia tentando di aprire una connessione a SQL Server.

È necessario aggiungere un accesso a SQL Server per IIS APPPOOL\ASP.NET v4.0e concedere le autorizzazioni al database.

In SSMS, sotto il server, espandi Sicurezza, quindi fai clic con il pulsante destro del mouse su Accesso e seleziona "Nuovo accesso ...".

Nella finestra di dialogo Nuovo accesso, immettere il pool di app come nome di accesso e fare clic su "OK".

inserisci qui la descrizione dell'immagine

È quindi possibile fare clic con il pulsante destro del mouse sul login per il pool di app, selezionare Proprietà e selezionare "Mappatura utente". Controllare il database appropriato e i ruoli appropriati. Penso che potresti semplicemente selezionare db_datareadere db_datawriter, ma penso che dovresti ancora concedere le autorizzazioni per eseguire le procedure memorizzate se lo fai tramite EF. Puoi controllare i dettagli per i ruoli qui .


8
grazie, ho fatto quello che sei triste, ora ricevo questo errore: Impossibile aprire il database "SiteNameExtension" richiesto dal login. Accesso fallito. Accesso non riuscito per l'utente "IIS APPPOOL \ DefaultAppPool".
GibboK,

76
MOLTO IMPORTANTE: NON FARE CLIC SU RICERCA PER PROVARE A CONFERMARE IL LOGIN! Non lo riconoscerà ma funzionerà. Basta inserirlo come IIS APPPOOL \ SimonsAppPoolName. Vedere questo stackoverflow.com/questions/1933134
Simon_Weaver

6
Invece è meglio cambiare 'Identity' in 'LocalSystem' da IIS, come descritto nella prossima risposta.
Altaf Patel,

Può funzionare quando l'istanza del server SQL si trova su un altro computer host allora il tuo computer host IIS? Perché devo risolvere lo stesso problema, ma SQL e IIS non si trovano sulla stessa macchina. Quindi l'uso dell'autenticazione di Windows per quel nuovo utente non funzionerà
Segers-Ian,

5
Per me l'utente da aggiungere era "IIS APPPOOL \ DefaultAppPool". Quindi ha funzionato.
Marcel,

343

È possibile modificare ApplicationPoolIdentity da IIS7 -> Pool di applicazioni -> Impostazioni avanzate. Impostazioni avanzate

Sotto ApplicationPoolIdentity troverai il sistema locale. Questo farà funzionare la tua applicazione sotto NT AUTHORITY\SYSTEM, che è un login esistente per il database per impostazione predefinita.

Modifica: prima di applicare questo suggerimento, è necessario annotare e comprendere le implicazioni sulla sicurezza.


51
@GibboK, se sei preoccupato per la sicurezza, non farlo. Vedi technet.microsoft.com/en-us/library/dd378907(v=WS.10).aspx
Jeff Ogata

4
Oltre a eseguire il pool di app come identità LocalSystem, dovevo anche mappare l'utente "NT AUTHORITY \ SYSTEM" sui ruoli del database
Phil

31
Questo puzza. Concedere l'autorizzazione di SISTEMA a un'app Web è una ricetta per il disastro e consente a tutti i maltrattati di cogliere ogni opportunità per infliggere cattiverie non solo all'app Web, ma all'intero server di hosting. Solo perché il DB accetta accessi da SYSTEM non significa che è necessario eseguire l'app Web come SYSTEM. Il desktop di Windows non ti permetterà nemmeno di correre come SISTEMA (senza saltare attraverso i cerchi). Eseguire una webapp con questa autorità è un'idea davvero, davvero stupida. È necessario fare in modo che il DB accetti l'identità attuale dell'apppool. -100 se potessi. -1.
spender

8
SYSTEM è più privilegiato dell'amministratore. Non dovresti MAI eseguire il tuo server web con qualcosa che si avvicini a quel livello.
slugster,

1
Rendo l'account Guest un membro del gruppo di amministratori. Semplice, pulito, non avere mai problemi con le cazzate di sicurezza.

29

assicurati di avere ...

Trusted_Connection=false;

nella tua connessione String


7
Avere Trusted_Connection = true nella stringa di connessione sovrascriverà i valori di autenticazione SQL con il profilo utente di IIS Identity.
Jeff l'orso,

2
nel mio caso rimuovendo: Integrated Security = True dalla stringa di connessione risolto.
Carlos R Balebona,

Ha funzionato per me. Salvato il giorno @JefftheBear
D_Edet il

26

Ho risolto questo problema usando sql come immagine seguente.

Fare clic con il tasto destro su db-> proprietà -> autorizzazione -> Visualizza autorizzazione server -> e quindi selezionare IIS APPPOOL\ASP.NET v4.0e concedere l'autorizzazione.

db


Il processo (e l'immagine) di cui sopra sta descrivendo le autorizzazioni GRANTing Server Level a quell'identità del pool di applicazioni? Non sembra una buona idea.
Chris Walsh,

2
Questo utente merita la medaglia! Nulla ha aiutato tranne questo!
Khateeb321,

2
@ Khateeb321 assolutamente, grazie mille DevT per la tua risposta.
Azxdreuwa,

22

Esegui questo script 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

Grazie, il modo più semplice;) +1
Zolfaghari,

11

Se nella stringa di connessione hai specificato:

User ID=xxx;Password=yyy

ma nella stringa di connessione c'è:

Trusted_Connection=true;

SQL Server utilizzerà l'autenticazione di Windows, quindi i valori della connessione verranno ignorati e sovrascritti (IIS utilizzerà l'account Windows specificato nel profilo utente Identità). maggiori informazioni qui

Lo stesso vale se nella stringa di connessione è presente:

 Integrated Security = true;

o

 Integrated Security = SSPI;

poiché l'autenticazione di Windows verrà utilizzata per connettersi al server di database. maggiori informazioni qui


10

vai su iis -> pool di applicazioni -> trova il tuo pool di applicazioni utilizzato nell'applicazione

inserisci qui la descrizione dell'immagine

selezionare il pool di applicazioni utilizzato per l'applicazione fare clic con il tasto destro del mouse selezionare impostazioni avanzate

inserisci qui la descrizione dell'immagine

Seleziona l'identità del pool di applicazioni inserisci qui la descrizione dell'immagine

seleziona integrato come Sistema locale e fai clic su OK


7

Odio ApplicationPoolIdentity. Ho sempre impostato un account utente di Windows come account su AppPools.

Come dice alla deriva, sembra un problema di sicurezza del database. Quindi creare un account utente NT, assegnarlo all'App.ool ASP.NET v4.0 e quindi concedergli l'autorizzazione nella cartella del sito Web e nelle tabelle pertinenti in SQL.


scusa, non ho idea di come farlo, potresti indicarmi un tutorial? grazie per il vostro aiuto su questo
GibboK

2
Non farlo, c'è una ragione per cui IIS ha cambiato l'identità del pool di app, learn.iis.net/page.aspx/624/application-pool-identities
Julien Lebot

@ LeSnip3R link non funzionante
Adaptabi

6

Non utilizzare la sicurezza integrata. UsoUser Id=yourUser; pwd=yourPwd;

Questo risolve il problema.


4

Ho avuto questo problema ed è stato effettivamente causato da qualcosa di diverso - avevo l'utente 'IIS APPPOOL \ ASP.NET v4.0' nel mio database ma non funzionava ancora.

Di recente avevo aggiornato la mia installazione di SQL Server e nel frattempo l'Utente si era disconnesso dall'Accesso, quindi c'era un 'IIS APPPOOL \ ASP.NET v4.0' in Database -> Sicurezza -> Utenti MA nessun Utente non in Sicurezza -> Login.

Aggiunto il login 'IIS APPPOOL \ ASP.NET v4.0' a Sicurezza -> Accessi, SQL Server lo ha mappato automaticamente sull'utente nel database (questo doveva essere fatto manualmente) e il problema è stato risolto.


1
solo per aggiungere ... a sinistra, sotto Autorizzazioni ... tick db_writer e db_reader; e selezionare il database che utilizzerà tali autorizzazioni.
benjieb,

4

Prima cosa che devi cancellare se stai usando l'autenticazione di Windows e non stai menzionando alcuna password nome utente nella tua stringa di connessione:

Cosa succede quando si esegue il codice tramite localhost: quando si esegue il client di test wcf da localhost, sarà in grado di comunicare con il database poiché l'applicazione in modalità di debug locale chiama il database dal servizio dell'account. Quindi ha accesso al database perché devenv.exe è in esecuzione con il tuo account utente.

Ma quando si distribuisce il servizio Web in IIS. Ora capisci che questo servizio funziona con IIS non con il tuo account. Quindi è necessario assegnare i diritti di accesso al servizio IIS per accedere al server sql per l'autenticazione di Windows. Qui il tuo servizio web non sarebbe in grado di comunicare con il server SQL a causa del problema dei diritti di accesso e Accesso non riuscito per l'utente_______ (qui verrà il tuo utente)

Pertanto, se si utilizza l'autenticazione di Windows per connettere il database, è sufficiente modificare le impostazioni del pool di applicazioni IIS. È necessario modificare l'identità del pool di applicazioni IIS sul sistema locale.

Di seguito sono riportati i passaggi per l'autenticazione Windows WCF:

1) Apri IIS (windows + R (esegui), quindi digita inetmgr, quindi fai clic su ok)

2) fare doppio clic sul nome del PC in Connessioni

3) Fare clic su Pool di applicazioni

4) Seleziona il tuo pool di app (DefaultAppPool)

5) Quindi, sotto le azioni a destra, fai clic su Impostazioni avanzate:

6) Vai alla sezione Modello di processo e

7) fare clic su Identità.

8) Ora seleziona LocalSystem.

Ora apri il tuo sql server management studio: apri run-> quindi digita ssms -> quindi premi ok In ssms, accedi usando il tuo account di autenticazione di Windows. Apri la scheda di sicurezza, espandi la scheda di accesso e sarai in grado di visualizzare il tuo account.

Ora apri le proprietà del tuo account vai su userMapping quindi seleziona il database che desideri connettere quindi controlla i servizi di appartenenza al ruolo che desideri utilizzare per il database selezionato. clicca ok

(Per i servizi di rete, vale a dire gli utenti Intranet, è necessario configurare le impostazioni precedenti anche per l'utente NT AUTHORITY \ SYSTEM)

aggiungi Trusted_Connection = True; proprietà nella stringa di connessione. Salvalo e distribuisci il servizio web. Riavvia pool di app.

sarai in grado di connettere il database ora.


Perfetto! LocalSystem ha risolto questo problema per me :)
totalitario il

3

Ho ricevuto questo messaggio e utilizzo l'autenticazione di Windows sul server Web.

Volevo che l'utente web attualmente autenticato fosse autenticato rispetto al database, piuttosto che usare l'utente APPPOOL \ ASP.NET v4 IIS specificato nel pool di app.

Ho trovato inserendo quanto segue nel web.config risolto questo per me:

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

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

Vedo altre risposte riguardanti la creazione del nome utente AppPool nel database SQL o solo per utilizzare SQL Auth. Entrambi sarebbero corretti se non si volesse acquisire o proteggere singoli utenti Windows all'interno di SQL.

Tom


Questo ha risolto il problema per noi e non siamo sicuri del perché. IIS / AppPool dirotta semplicemente la stringa di connessione che dice esplicitamente "Sicurezza integrata = vero"? Perché??
Guy,

3

1_in SqlServer Security => Login => NT AUTHORITY \ SYSTEM => RightClick => Property => UserMaping => Seleziona YourDatabse => Public && Owner Select => OK 2_In IIs Pool di applicazioni DefaultAppPool => Impostazioni avanzate => Identità => LocalSystem => Ok


2

L'impostazione dell'identità rende questo lavoro solo nelle mie pagine.


2

Cassini gestisce il tuo sito Web come la tua identità utente all'avvio dell'applicazione Visual Studio. IIS gestisce il tuo sito Web come identità del pool di app. A meno che all'identità del pool di app non venga concesso l'accesso al database, si ottengono errori.

IIS ha introdotto l'identità del pool di app per migliorare la sicurezza. È possibile eseguire siti Web con l'identità predefinita del pool di app o creare un nuovo pool di app con il proprio nome o creare un nuovo pool di app con il proprio nome che viene eseguito con un account utente (in genere account di dominio).

In situazioni di rete (che non sono in Azure) è possibile eseguire un nuovo pool di app con un account utente di dominio di Active Directory; Preferisco questo rispetto all'account macchina. In questo modo si garantisce una sicurezza granulare e un accesso granulare alle risorse di rete, inclusi i database. Ogni sito Web viene eseguito su un pool di app diverso (e ciascuno di essi viene eseguito con il proprio account utente di dominio).

Continuare a utilizzare la sicurezza integrata di Windows in tutte le stringhe di connessione. In SQL Server, aggiungere gli utenti del dominio come accessi e concedere le autorizzazioni a database, tabelle, SP, ecc. Per sito Web. Ad esempio, DB1 utilizzato da Website1 ha un accesso per User1 perché Website1 viene eseguito su un pool di app come User1.

Una sfida con la distribuzione dal DB incorporato di Visual Studio (ad esempio LocalDB) e dal server Web incorporato in un ambiente di produzione deriva dal fatto che l'utente SID dello sviluppatore e i suoi ACL non devono essere utilizzati in un ambiente di produzione sicuro. Microsoft fornisce strumenti per la distribuzione. Peccato per il povero sviluppatore che è abituato a tutto ciò che sta funzionando immediatamente nel nuovo facile IDE VS con localDB e localWebServer, perché questi strumenti saranno difficili da usare per quello sviluppatore, specialmente per uno sviluppatore privo di supporto SysAdmin e DBAdmin o la loro conoscenza specializzata. Tuttavia, la distribuzione in Azure è più semplice della situazione della rete aziendale sopra menzionata.


2

Se hai la stringa di connessione aggiunta in web.config, assicurati che "Sicurezza integrata = false;" quindi userebbe l'id e la password specificati in 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

Come sottolineato, non utilizzare l'autenticazione di Windows, utilizzare l'autenticazione di SQL Server

Inoltre, se hai creato una connessione utilizzando la finestra di dialogo "Connessione server", assicurati di controllare le connessioni in web.config. È probabile che tu abbia creato / modificato la connessione ed è stata memorizzata come connessione sicura in web.config. Usa semplicemente questa autenticazione

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

che dovrebbe correggere l'errore.


2

Un altro modo per concedere l'autorizzazione al database per l'utente IIS APPPOOL\ASP.NET v4.0è il seguente.
inserisci qui la descrizione dell'immagine


  1. Aggiungi nuovo utente con nome utente e nome di accesso come IIS APPPOOL\ASP.NET v4.0con lo schema predefinito.
  2. Vai a Schema proprietario e Iscrizione, Controlla db_datareader, db_datawriter

1

Ho pensato di pubblicare questo come una risposta in quanto è rilevante per la domanda e in alcuni casi può rispondere.

Lo stesso messaggio appare anche se il database non esiste!

Assicurarsi che la stringa di connessione non abbia errori di ortografia, sia rivolta all'istanza del server corretta, ecc.


1

Ho lo stesso problema che ho risolto cambiando Integrated Security=Truein falso ora funziona


1

qualcosa di simile mi è successo e ciò che ha funzionato per me è stato modificare la proprietà Sicurezza integrata = True in Sicurezza integrata = false nella configurazione web del sito Web


questo funziona! Ho appena rimosso la sicurezza integrata
Charles Xavier il

0

Hai fatto quanto @Teddyraccomandato e hai ANCORA ottenuto lo stesso errore?

Assicurati di modificare le impostazioni per il pool di app che corrisponde alla tua directory virtuale e non al server di appartenenza. Ogni directory virtuale ha il proprio AppPool e non eredita.


0

In DefaultAppPool imposta NetworkService nella proprietà Identity e in Sql Server aggiungi User Network Service e dagli le autorizzazioni appropriate al tuo database, per me funziona molto bene, ho testato localmente ma penso che questa sia la migliore configurazione per la connessione da qualsiasi altro computer in rete. quando si imposta LocalSystem in Identity in IIS che funziona bene e non è necessario creare nessun altro utente in SQL Server ma penso che non funzionerà in un ambiente di rete.


0

Ho riscontrato lo stesso problema durante il test dell'API Web ASP.NET

Sviluppato Web.Host nel database di Visual Studio 2013 Express creato in SQL Server 2012 Express Test eseguito utilizzando IIS Express integrato (funzionante) Modificato per utilizzare IIS Local (dalla pagina delle proprietà - opzione Web) Test eseguito con Fiddler Errore ricevuto - impossibile aprire il database per il provider .... citando "APPPOOL \ DefaultAppPool"

Soluzione che ha funzionato.

In IIS

Fai clic sul pool di applicazioni 'DefaultAppPool' Set Identify = 'ApplicationPoolIdentity' Set .NET framework = v4.0 (anche se la mia app era 4.5)

In SQL Server Management Studio

Fare clic con il tasto destro del mouse sulla cartella Sicurezza (sotto il motore di SQL Server, quindi si applica a tutte le tabelle) Fare clic con il tasto destro del mouse su Utente e aggiungere "IIS APPPOOL \ DefaultAppPool". Riguardo a quanto sopra se sei un DBA probabilmente conosci e vuoi controllare quali sono queste opzioni. Se sei come me uno sviluppatore voleva solo testare il tuo servizio API WEB che accede anche a SQL Server tramite EF 6 in stile MVC, quindi seleziona tutto. :) Sì, lo so ma ha funzionato.


0

Nel caso in cui si aggiunga un nuovo accesso, assicurarsi che sotto le proprietà del server (tasto destro -> proprietà) / sicurezza, la modalità di autenticazione sia impostata su sqlserver e Windows non solo su Windows.


0

Aggiungi "Tutti" in sicurezza. Se hai aggiunto il server e gli utenti che accedono al database, questo è qualcosa che ti manca. Spero che sia di aiuto.


Impostiamo le autorizzazioni in base alle nostre esigenze. La parte di autenticazione viene gestita e controlliamo l'autorizzazione tramite codice per consentire l'accesso. Sentiti libero di correggermi se senti che c'è qualche ambiguità. Grazie.
avinava basu,

0

Per la cronaca, se si verifica questo errore dopo il passaggio da LocalDBa SQLEXPRESS, assicurarsi che il database esista giàSQLEXPRESS . È possibile verificarlo in Management Studio.

Ho avuto lo stesso problema durante l'utilizzo Entity Frameworkdopo il passaggio a SQLEXPRESS from LocalDB. Ho dovuto eseguire il Update-Databasecomando. Dopo sono stato in grado di connettermi con successo.


0

Ho fatto esattamente come ha detto @JeffOgata ma ho ricevuto l'errore:

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

Ho guardato di nuovo il mio messaggio di errore e ha detto Login failed for user 'IIS APPPOOL\DefaultAppPool'.

Dopo aver aggiunto un utente chiamato IIS APPPOOL\DefaultAppPooltutto ha funzionato.


0

Ho usato SQL Server Profiler (disponibile in SSMS => menu Strumenti) e ho visto lì (quando IIS ha tentato di connettersi al database) che il mio utente IIS era per qualche motivo NT AUTHORITY \ IUSR, indipendentemente da tutti i passaggi consigliati nelle risposte a questa domanda . Quindi ho aggiunto quell'utente a SQL Server e ha funzionato ...


0

Nel modulo web Asp.net,

questo errore è stato corretto durante l'installazione di asp.net da:

Server Manager> Gestisci> Aggiungi ruolo e funzionalità> Ruoli server> Server Web (IIS)> Server Web> Sviluppo applicazioni> ASP.NET 3.5 / 4.6 è installato.

il mio problema è stato risolto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.