2012-06-24 14 views
6

Ho creato un sito Web ASP.NET MVC 2 che sto ospitando con Rackspace Cloud Server utilizzando IIS 7.0.Come configurare SQL Server/IIS 7.0 per consentire al sito Web ASP.NET MVC di accedere al database?

Quando si tenta di testare il sito Web in localhost con IIS 7.0 sul server, viene visualizzata una pagina di errore. Questo deriva dai log di SQL (sto usando Web SQL Edition):

Error: 18456, Severity: 14, State: 11 
Login failed for user 'IIS APPPOOL\DefaultAppPool'. Reason: Token-based server access validation failed with an infrastructure error. Check for previous errors. [CLIENT: <local machine>] 

Mio sito funziona bene sul mio PC di casa in modo che il problema è qualcosa a che fare con la connessione con il database.

Dopo aver ricercato il codice del messaggio di errore, suggerisce di disporre di un accesso DB valido ma l'accesso al server non è riuscito. Ho fatto una pila di lettura intorno a questo su vari forum e qui è quello che ho provato, nessuno dei quali hanno risolto il problema (incl StackOverflow/ServerFault.):

  1. Impostare nuovo account di accesso utilizzando l'autenticazione di SQL Server. Ho creato un nuovo accesso in SQL e fornito i diritti di accesso corretti al mio DB. Ho usato la seguente stringa di connessione nella configurazione web:

    Origine dati = myServer; Catalogo iniziale = myDB; ID utente = myUsername; Password = myPassword;

  2. Crea nuovo accesso come IIS APPPOOL\DefaultAppPool. Ho creato un nuovo accesso in SQL con i diritti di accesso corretti e l'autenticazione Windows utilizzata. Stringa di connessione come segue:

    Server = myServer; Database = myDataBase; Trusted_Connection = True;

  3. Utilizzare l'accesso di rete esistente NT AUTHORITY\NETWORK SERVICE. Ho mappato questo utente al mio database con i diritti di accesso corretti. Stringa di connessione come segue:

    Server = myServer; Database = myDataBase; Trusted_Connection = True;

Queste sembrano essere le opzioni principali mentre ho letto il materiale online. Infine, qui come alcune altre cose che possono essere utili:

  • Impostazione SQL per Esegui come amministratore non ha risolto il problema
  • Spegnimento UAC non ha aiutato
  • mio pool di applicazioni sta usando ApplicationPoolIdentity (migliore per motivi di sicurezza)

In breve, il mio sito Web non verrà avviato perché non è possibile ottenere un oggetto dal DB, pertanto genera un errore. Il problema è che i diritti di accesso al server non sono impostati correttamente. Non riesco a capire quale configurazione dei diritti di accesso/connessione/dominio di accesso SQL necessari.

Questo mi ha irritato per 3 settimane - puoi risparmiare 5 minuti per aiutarmi per favore?

+0

Puoi pubblicare la stringa di connessione corrente? Presumo che ti stia connettendo con Integrated Security, pertanto AppPoolIdentity viene utilizzato per connettersi a SQL Server. Inoltre, ti preghiamo di indicare se i tuoi server web e sql sono in esecuzione in una configurazione di Active Directory. –

+0

Utilizzo: 'Origine = SetsOfSix; Catalogo iniziale = SetsOfSix; Sicurezza integrata = SSPI; '. Consentitemi di andare a controllare la domanda sulla configurazione della directory attiva ... –

+0

Su IIS 'Active Directory Domain Services' non è installato. Come dovrei controllare se i server web e sql sono in esecuzione nella configurazione Active Directy? –

risposta

8

Poiché i server (Web e SQL) non fanno parte di un dominio, non è possibile utilizzare l'autenticazione di Windows (sicurezza integrata) per connettersi a SQL Server.

In IIS, quando si dispone di Integrated Security=SSPI in una stringa di connessione, l'utente effettivo utilizzato per connettersi a SQL Server è l'identità del pool di applicazioni.

Si consiglia di utilizzare l'opzione 1, ovvero Configurare il nuovo accesso utilizzando l'autenticazione di SQL Server.

Quindi, sarebbero i passi:

  1. Crea il tuo utente myUsername SQL Server.
  2. Nella finestra di dialogo delle proprietà dell'utente, passare alla sezione Securables e verificare che sia selezionato Public.
  3. Successivamente, passare alla sezione User mapping (sul lato sinistro). Cerca il/i tuo/i database/i nell'elenco e controllalo. Sotto, nell'elenco Database role membership, assicurati di controllare public, db_datareader e db_datawriter.
  4. Ora concedere all'utente il diritto di eseguire le stored procedure. Come sa, in Management Studio, eseguire:

    ESEGUIBILE A myUserName;

  5. Il gioco è fatto.

quanto riguarda la sicurezza, in seguito sarà possibile perfezionare i diritti delle myUserName di non essere in grado, ad esempio, far cadere le tabelle o altri oggetti.

Nella propria applicazione si dovrebbe usare ora la stringa di connessione al vostro punto 1.

Se avete altri problemi, quindi si prega di inviare il messaggio di errore.

+0

Grazie. Il bit che mi mancava era (a) l'impostazione 'GRANT EXECUTE' e (b) nel mio LINQ-to-SQL avevo un riferimento di stringa di connessione scorretto. Risolvere entrambi i problemi risolti. Il tuo aiuto mi ha fatto guardare nel posto giusto. –

Problemi correlati