Description du problème :  Impossible de faire une connexion sur une instance  SQL Server 2008 depuis un serveur distant avec un compte Windows. Nous  obtenons le message d'erreur : Impossible de générer un contexte SSPI.


Tests réalisés : Nous avons suivi les étapes ci-dessous :

Etape 1:  Nous avons exécuté un   TELNET sur le machine et le port. Nous avons confirmé que le port SQL était ouvert.

Etape 2:  Nous avons vérifié que les SPN pour notre instance SQL Server existe avec la commande ci-dessous :

Démarrer >> Exécuter... >> CMD >> Setspn -L <NomDeVotreCompteDeServicePourSQL>

Registered ServicePrincipalNames for CN=svc-mssql-sgbd,OU=Users,OU=_Paris,DC=puteaux,DC=net:
        MSSQLSvc/serverName:PORT
        MSSQLSvc/serverName


Etape 3: Depuis le serveur distant, j'ai utilisé un fichier UDL pour réaliser une connexion sans passer par l'application.

Clic droit sur mon bureau  >> nouveau fichier >> puis renommer l'extension de votre fichier texte avec le nom suivant :  myTest.UDL.


 
Double cliquer sur le fichier myTest.UDL. Puis sur l'onglet FOURNISSEUR. Et selectionner le provider : SQL Server Native client 10.0

     J'ai essayé de faire une connexion avec un autre protocol réseau, comme  Name Pipe.
     Np:<ServerName>\<IntanceName>  
          La connexion a fonctionné


     Puis j'ai forcé le protocol TCP mais avec une authentification  SQL  
     tcp:<ServerName>\<IntanceName> 
          La connexion a fonctionné

     Puis j'ai essayé toujours avec le protocol TCP mais avec une authentification  Windows 
     tcp:<ServerName>\<IntanceName>  
          La connexion a échoué avec le mesage : Impossible de générer un contexte SSPI

     Puis j'ai re essayé avec le protocol TCP, l'authentification, mais en forçant le port SQL
     tcp:<ServerName>\<IntanceName>,PortNumberOfSQL  
          La connexion a échoué avec le mesage : Impossible de générer un contexte SSPI

     Pour terminé, j'ai essayé toujours en TCP mais avec un autre compte Windows 
     tcp:<ServerName>\<IntanceName> 
          La connexion a fonctionné

 

 

Cause : Nous donc un problème avec les connexions TCP pour un compte Windows précis. Nous avons activé un mode plus verbeux de logs pour capturer les messages kerberos en suivant l'article : http://support.microsoft.com/kb/262177 .

Et nous avons découvert le message d'erreur ci-dessous dans le journal d'événement system :

The kerberos SSPI package generated an output token of size 12536 bytes, which was too large to fit in the token buffer of size 12535 bytes, provided by process id 4.
The output SSPI token being too large is probably the result of the user
myUser@myDomain.com  being a member of a large number of groups.
It is recommended to minimize the number of groups a user belongs to. If the problem can not be corrected by reduction of the group memberships of this user, please contact your system administrator to increase the maximum token size, which in term is configured machine-wide via the following registry value: HKLM\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters\MaxTokenSize.

 

 

Résolution : Nous avons augmenté la taille du MaxTokenSize pour faire repartir la production. : http://support.microsoft.com/kb/327825 , puis le client a recherché pourquoi cet utilisateur est un membre d'un grand nombre de groupes.

 

 

Ressources annexes :

     The SQL Network Interface library was unable to register SPN

     How to troubleshoot the "Cannot generate SSPI context" error message

     “Cannot Generate SSPI Context” error message, more comments for SQL Server

Michel Degremont | Premier Field Engineer - SQL Server Core Engineer |