Une application qui fonctionne sans problème (et sur laquelle aucun développement actif n’a été effectué depuis environ 6 mois) a récemment commencé à ne pas se connecter à la base de données. Les administrateurs des opérations ne peuvent pas dire ce qui aurait pu changer le problème.
L'application client utilise une chaîne de connexion codée en dur avec Integrated Security = True, mais lorsque l'application tente de créer une connexion à la base de données, elle génère une exception SQLException disant "Échec de la connexion pour l'utilisateur 'NT AUTHORITY\ANONYMOUS LOGON.
Je peux me connecter à la base de données via Management Studio sur ce compte sans problème. Toutes les choses que j'ai vues dans ce numéro concernent des projets ASP.NET et, apparemment, il s’agit du «problème du double saut» qui, en tant qu’application cliente, vaut mieux ne pas poser de problème. Toute aide serait grandement appréciée.
Les ordinateurs client et serveur ainsi que les comptes d'utilisateurs se trouvent sur le même domaine . Cela se produit lorsque le pare-feu Windows est désactivé.
La théorie dominante est la suivante: Le serveur a été redémarré il y a environ une semaine et n'a pas pu enregistrer le nom de service principal (SPN). Si vous n'enregistrez pas un nom principal de service, l'authentification intégrée risque de se replier sur NTLM au lieu de Kerberos.
Si votre problème concerne les serveurs liés, vous devez examiner quelques points.
Tout d’abord, vos utilisateurs doivent avoir activé la délégation et si la seule chose qui a changé, c’est probablement le cas. Sinon, vous pouvez décocher la case "Le compte est sensible et ne peut pas être délégué" dans les propriétés de l'utilisateur dans AD.
Deuxièmement, vos comptes de service doivent être approuvés pour la délégation. Depuis que vous avez changé votre compte de service régulièrement, je soupçonne que c'est le coupable. ( http://technet.Microsoft.com/en-us/library/cc739474(v=ws.10).aspx )
Vous avez évoqué des problèmes de SPN. Veillez donc à définir le SPN pour les deux systèmes d'extrémité, sinon vous ne pourrez pas voir l'onglet de délégation dans AD. Assurez-vous également que vous êtes en mode avancé dans "Utilisateurs et ordinateurs Active Directory".
Si vous ne voyez toujours pas l'onglet de délégation, même après avoir corrigé votre SPN, assurez-vous que votre domaine n'est pas en mode 2000. Si c'est le cas, vous pouvez "augmenter le niveau de fonction du domaine".
À ce stade, vous pouvez maintenant marquer le compte comme étant approuvé pour la délégation:
Dans le volet d'informations, cliquez avec le bouton droit de la souris sur l'utilisateur pour lequel vous voulez être approuvé délégation, puis cliquez sur Propriétés.
Cliquez sur l'onglet Délégation, sélectionnez le compte est approuvé pour la délégation case à cocher, puis cliquez sur OK.
Enfin, vous devrez également définir toutes les machines comme fiables pour la délégation.
Une fois cela fait, reconnectez-vous à votre serveur SQL et testez vos serveurs préférés. Ils devraient travailler.
Tout d’abord: mon problème n’est pas exactement le même que le vôtre, mais ce message est la première chose qui apparaît dans Google pour l’erreur Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'
au moment où j’ai écrit ceci. La solution peut être utile aux personnes recherchant cette erreur car je n'ai trouvé cette solution spécifique nulle part en ligne.
Dans mon cas, j'ai utilisé Xampp/Apache et PHP sqlsrv pour essayer de se connecter à une base de données MSSQL à l'aide de l'authentification Windows et j'ai reçu l'erreur Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'
que vous avez décrite. J'ai finalement trouvé que le problème venait du service Apache lui-même fonctionnant sous l'utilisateur "SERVICE LOCAL" au lieu du compte d'utilisateur pour lequel j'étais connecté. En d'autres termes, il utilisait littéralement un compte anonyme. La solution consistait à accéder à services.msc, à cliquer avec le bouton droit sur le service Apache, à accéder à Propriétés, à l'onglet Connexion et à saisir les informations d'identification de l'utilisateur. Cela correspond à votre problème lié aux SPN car vos SPN sont configurés pour s'exécuter à partir d'un utilisateur spécifique du domaine. Donc, si le SPN correct n'est pas en cours d'exécution, l'authentification Windows utilisera par défaut le mauvais utilisateur (probablement l'utilisateur "LOCAL SERVICE") et vous indiquera l'erreur anonyme.
Voici où il est différent de votre problème. Aucun des ordinateurs du réseau local ne se trouve sur un domaine, ils ne font que sur un groupe de travail. Pour utiliser l'authentification Windows avec un groupe de travail, l'ordinateur avec le serveur (dans mon cas, le serveur MSSQL) et l'ordinateur avec le service demandant des données (dans mon cas, Apache) devaient avoir un utilisateur avec un nom et un mot de passe identiques.
En résumé, l’erreur Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'
dans nos deux cas semble être due à un service qui ne fonctionne pas et/ou pas sur le bon utilisateur. S'assurer que le bon SPN ou autre service est en cours d'exécution et sous le bon utilisateur doit résoudre la partie anonyme du problème.
Je pense qu'il doit y avoir eu un changement dans le groupe AD utilisé pour s'authentifier auprès de la base de données. Ajoutez le nom du serveur Web, au format domaine\Webservername $, au groupe AD ayant accès à la base de données. En outre, essayez également de définir l'attribut web.config sur "false". J'espère que ça aide.
EDIT: En reprenant ce que vous avez édité, cela indique probablement que le protocole d'authentification de votre serveur SQL Server est passé de Kerberos (valeur par défaut si vous utilisiez l'authentification intégrée de Windows) à NTLM. Pour utiliser le nom principal de service (SPN) Kerberos, vous devez être inscrit dans le service d'annuaire Active Directory. Les noms de principal de service (SPN) sont des identifiants uniques pour les services exécutés sur des serveurs. Chaque service qui utilisera l'authentification Kerberos doit avoir un SPN défini pour que les clients puissent identifier le service sur le réseau. Il est enregistré dans Active Directory sous un compte d'ordinateur ou un compte d'utilisateur. Bien que le protocole Kerberos soit le protocole par défaut, en cas d'échec, le processus d'authentification sera essayé à l'aide de NTLM.
Dans votre scénario, le client doit établir une connexion TCP et il s'exécute très probablement sous un compte LocalSystem. Il n'y a pas de SPN enregistré pour l'instance SQL. Par conséquent, NTLM est utilisé. Cependant, le compte LocalSystem hérite du contexte système au lieu d'un véritable utilisateur. le contexte basé sur, donc, a échoué en tant que 'ANONYMOUS LOGON'.
Pour résoudre ce problème, demandez à votre administrateur de domaine d'enregistrer manuellement le SPN si votre serveur SQL Server s'exécutant sous un compte d'utilisateur de domaine . Les liens suivants pourraient vous aider davantage:
http://blogs.msdn.com/b/sql_protocols/archive/2005/10/12/479871.aspx
http://support.Microsoft.com/kb/909801
Il vous suffit probablement de fournir un nom d'utilisateur et un mot de passe dans votre chaîne de connexion et de définir Integrated Security = false
Un de mes travaux SQL avait le même problème. Il s’agissait de télécharger des données d’un serveur à un autre. L'erreur s'est produite parce que j'utilisais le compte de service SQL Server Agent. J'ai créé une référence à l'aide d'un identifiant utilisateur (qui utilise l'authentification Windows) commun à tous les serveurs. Puis créé un proxy en utilisant ces informations d'identification. Utilisé le proxy dans le travail de serveur SQL et il fonctionne correctement.
FWIW, dans notre cas, un site Web (PHP) exécuté sur IIS affichait ce message lors de la tentative de connexion à une base de données.
La solution consistait à éditer l'authentification anonyme sur ce site Web pour utiliser l'identité du pool d'applications (et nous avons configuré l'entrée du pool d'applications pour qu'elle utilise un compte de service conçu pour ce site Web).
Essayez de définir "Integrated Security = False" dans la chaîne de connexion.
<add name="YourContext" connectionString="Data Source=<IPAddressOfDBServer>;Initial Catalog=<DBName>;USER ID=<youruserid>;Password=<yourpassword>;Integrated Security=False;MultipleActiveResultSets=True" providerName="System.Data.SqlClient"/>