giovedì, gennaio 29, 2009

Asp.Net - Login failed for user 'NT AUTHORITY\NETWORK SERVICE'

NT AUTHORITY\NETWORK SERVICE è l'utente di default usato da IIS6 per l'esecuzione degli Application Pool. Le pagine asp.net girano nel contesto di tale utente.
Quindi le connessioni verso sql server, se viene usata Integrated Secutiry, avvengono con le credenziali di NETWORK SERVICE.
Affinchè l'autenticazione vada a buon fine, l'utente NETWORK SERVICE deve essere riconosciuto da sql server e deve avere accesso al db in questione.


Paginetta di test abc.aspx:

<%@ Page Language="C#"  %>
<html>
<body>
Connection Test: <%=DateTime.Now.ToString()%><br><br>
<%
System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection("data source=localhost;integrated security=sspi;database=northwind");
conn.Open();
conn.Close();
%>
</body>
</html>


L'errore che normalmente si incontra è:
Login failed for user 'NT AUTHORITY\NETWORK SERVICE'

Significato: l'utente non è in grado di autenticarsi sul sql server (utente sconosciuto, password errata, ecc.).

E' necessario aggiungere l'utente a sql server in modo che possa essere riconosciuto.

SqlServer Management Studio
 - Security
    - Logins
      - New Login
         - Login Name --> Search - cercare 'NT AUTHORITY\NETWORK SERVICE' fra gli utenti locali

A questo punto l'utente è presenta nella lista dei login di Sql Server. Riprovando a connettersi dovrebbe apparire un messaggio di errore un po' diverso:
Cannot open database "northwind" requested by the login. The login failed.
Login failed for user 'NT AUTHORITY\NETWORK SERVICE'.

E' necessario abilitare l'utente NetworkService alla lettura e scrittura dei dati sul DB (nel nostro esempio northwind).

 - tasto destro su 'NT AUTHORITY\NETWORK SERVICE'
 - selezionare UserMapping
 - selezionare il DB (ad esempio NorthWind) nella tabella superiore
 - attivare db_datareader e db_datawriter nella tabella inferiore


A questo punto la connessione dovrebbe andare a buon fine e dovrebbe essere possibile eseguire le operazioni classiche su db (select,  update, delete, insert).  Se fosse necessario eseguire operazioni più di alto livello, tipo drop table e similari, sarà necessario assegnare all'utente privilegi più elevati.


Nota: 
Integrated Security=True oppure Integrated Security=SSPI ?
(AFAIK) Sembra che l'opzione true possa essere usata solo con NETSQLClient mentre non sia valida con OleDB. Boh... da quello che si legge in giro sembra che sia consigliato SSPI  (personalmente uso sempre SSPI).

1 commento:

Marco ha detto...

Ottimo! Ogni volta che devo far girare l'applicazione su IIS è un inferno, e questa è una delle cose che non mi entrava in testa. Grazie!