Molto spesso vediamo casi dove un’applicazione client prova a connettersi ad un SQL Server e fallisce con l’errore “Login failed for user ‘ ’”. Di solito questo significa che fallisce l’autenticazione NTLM, ma le cause di questo fallimento possono essere molto varie. In questo post vorrei approfondire una causa, che non è molto frequente ed evidente.

L’ambiente

  • Windows Server 2003, SP1 or later
  • SQL Server 2005
  • SQL Server 2008

Scenario tipico

  • Il problema si verifica in un’applicazione client che si connette a un database di SQL locale. L’applicazione è installata sullo stesso computer, su cui è installata l’istanza di SQL Server.
  • Se nella stringa della connessione viene usato l’autenticazione Windows e l’indirizzo IP anziché il nome del server, la connessione fallisce con l’errore “Login failed for user ‘ ’”.
  • Invece se viene usato il nome del server e la connessione viene aperta sotto lo stesso utente come nel caso precedente(quando fallisce), la connessione va a buon fine.
  • Anche se la connessione viene aperta da un client remoto e sempre sotto lo stesso utente, il problema non si verifica.

Causa

  • Questo comportamento si può verificarsi su Windows XP SP2 o Windows Server 2003 SP1 (o successivo), quando esiste un alias DNS creato nel file HOSTS (in cartella %SystemRoot%\System32\Drivers\Etc)
  • Windows XP SP2 e Windows Server 2003 SP1 hanno uno strumento che si chiama loopback check security. Questo strumento aiuta a prevenire gli attacchi di tipo reflection. Cosi quando FQDN oppure host header (configurato da utente) usati nell’applicazione non corrispondono al nome del computer locale, l’autenticazione fallisce.

Soluzione

  • Per risolvere il problema procedete come di seguito
    1. Aprire SQL Server Configuration manager e espandere SQL Native Client configuration
    2. Fare click su Alias e selezionare “New alias…”
    3. Impostare i seguenti valori:

      Alias Name
      =<Nome dell’alias come è salvato nel file HOSTS>
      Server=<Nome dell’istanza di SQL>
      Protocol=<protocollo che usate per la connessione>

      clip_image002
  • Come un’altro workaround potete creare Local Security Authority host name aggiungendo il nome dell’alias DSN al valore di chiave di registry BackConnectionHostNames. Maggiori dettagli potete trovarli nell’articolo http://support.microsoft.com/kb/926642 nella sezione “Metodo 1 (scelta consigliata)”

Ulteriori informazioni

Olga Guzheva
Senior Support Engineer
Microsoft Enterprise SQL Support