59 votes

Une application IIS utilisant l'identité du pool d'applications perd le jeton primaire ?

(Il s'agit d'une question sur un problème vague. J'essaie de présenter toutes les données pertinentes, dans l'espoir que quelqu'un ait des informations utiles ; mes excuses pour la longue description).

Notre application web

Nous avons une application web .NET 4 fonctionnant dans IIS 7.5 et accédant à Active Directory et à une base de données SQL Server.

Cette application Web est exécutée sous une "identité de pool d'applications" virtuelle, en définissant l'identité du pool d'applications de l'application comme suit ApplicationPoolIdentity . Une description concise des identités virtuelles peut être trouvée dans une réponse de StackOverflow L'identité d'un pool d'applications n'est qu'un groupe supplémentaire ajouté aux processus de travail de l'application web qui s'exécute en tant que "service réseau". Cependant, une source suggère vaguement que "Network Service et ApplicationPoolIdentity ont des différences que les documents du site IIS.net ne publient pas". Ainsi, une identité virtuelle pourrait être plus qu'un simple groupe supplémentaire.

Nous avons choisi d'utiliser ApplicationPoolIdentity, par opposition à NetworkService, parce qu'il est devenu la valeur par défaut dans IIS 7.5 (voir, par exemple, ici ), et selon la recommandation de Microsoft : "Cette identité permet aux administrateurs de spécifier des autorisations qui ne concernent que l'identité sous laquelle le pool d'applications s'exécute, ce qui renforce la sécurité du serveur." (de processModel Élément à ajouter pour applicationPools [schéma des paramètres IIS 7]. ) "Les identités de pool d'applications sont une nouvelle fonction d'isolation puissante" qui "rend l'exécution des applications IIS encore plus sûre et fiable. " (extrait de Article de IIS.net "Application Pool Identities" (en anglais) )

L'application utilise l'authentification intégrée de Windows, mais avec <identity impersonate="false"/> Ainsi, ce n'est pas l'identité de l'utilisateur final mais celle du pool d'applications virtuelles qui est utilisée pour exécuter notre code.

Cette application interroge Active Directory en utilisant le System.DirectoryServices c'est-à-dire l'API ADSI. Dans la plupart des cas, cela se fait sans spécifier un nom d'utilisateur/mot de passe supplémentaire ou d'autres informations d'identification.

Cette application se connecte également à une base de données SQL Server en utilisant Integrated Security=true dans la chaîne de connexion. Si la base de données est locale, alors nous voyons que IIS APPPOOL\OurAppPoolName est utilisé pour se connecter à la base de données ; si la base de données est distante, alors le compte machine OURDOMAIN\ourwebserver$ est utilisé.

Nos problèmes

Nous rencontrons régulièrement des problèmes où une installation fonctionnelle commence à échouer de l'une des manières suivantes.

  • Lorsque la base de données se trouve sur un système distant, alors la connexion à la base de données commence à échouer : "Echec de la connexion pour l'utilisateur 'NT AUTHORITY \ANONYMOUS LOGON'. Motif : La validation de l'accès au serveur par jeton a échoué avec une erreur d'infrastructure. Vérifiez les erreurs précédentes". L'erreur précédente est "Error : 18456, sévérité : 14, état : 11." Il semble donc que maintenant OURDOMAIN\ourwebserver$ n'est plus utilisé, mais un accès anonyme est tenté. (Nous avons des preuves anecdotiques que ce problème s'est produit lorsque l'UAC était désactivé, et qu'il a disparu après avoir activé l'UAC. Mais notez que la modification de l'UAC nécessite un redémarrage...) Un problème similaire est signalé dans IIS.net thread "use ApplicationPoolIdentity to connect to SQL" (utiliser ApplicationPoolIdentity pour se connecter à SQL) notamment dans une réponse .

  • Les opérations Active Directory via ADSI (System.DirectoryServices) commencent à échouer avec l'erreur 0x8000500C ("Unknown Error"), 0x80072020 ("An operations error occurred."), ou 0x200B ("The specified directory service attribute or value does not exist").

  • La connexion à l'application depuis Internet Explorer commence à échouer, avec des erreurs HTTP 401. Mais si, dans IIS, nous plaçons NTLM avant Negotiate, cela fonctionne à nouveau. (Notez que l'accès à AD est nécessaire pour Kerberos mais pas pour NTLM.) Un problème similaire est rapporté dans Fil de discussion IIS.net "L'authentification de la fenêtre échoue avec l'identité AppPool". .

Notre hypothèse et notre solution de rechange

Au moins, les problèmes d'AD et d'ouverture de session semblent toujours disparaître lorsque l'on passe du pool d'applications ApplicationPoolIdentity au NetworkService. (Nous avons trouvé un rapport confirmant cela.)

Page "Dépannage des problèmes d'authentification sur les pages ASP" propose quelques suggestions concernant les jetons primaires et secondaires, et ce que je trouve encourageant, c'est qu'il établit un lien entre les deux premières de nos erreurs : il mentionne NT AUTHORITY\ANONYMOUS LOGON et les erreurs AD 0x8000500C et "L'attribut ou la valeur du service de répertoire spécifié n'existe pas".

(La même page mentionne également des problèmes de cache de schéma ADSI, mais tout ce que nous pouvons trouver sur ce sujet est ancien. Pour l'instant, nous considérons que ce n'est pas lié).

Sur la base de ce qui précède, notre travail actuel hypothèse est que, seulement lorsqu'il fonctionne sous une identité de pool d'applications virtuelles, notre application web (IIS ? processus de travail ?) perd soudainement son jeton primaire de sorte que IIS ne dispose que d'un jeton secondaire, de sorte que tout accès à Active Directory et à SQL Server se fait de manière anonyme, ce qui entraîne toutes les erreurs susmentionnées.

Pour l'instant, nous avons l'intention de passer d'ApplicationPoolIdentity à NetworkService. Nous espérons que cela fera disparaître tous les problèmes mentionnés ci-dessus. Mais nous ne sommes pas sûrs, et nous aimerions revenir en arrière si possible.

Notre question

L'hypothèse ci-dessus est-elle correcte, et si oui, s'agit-il d'un bogue dans IIS/Windows/.NET ? Dans quelles circonstances cette perte de jeton primaire se produit-elle ?

35voto

Marnix Klooster Points 4353

Par l'intermédiaire de l'assistance Microsoft, j'ai découvert que nous avons rencontré le problème décrit dans Article KB2545850 de la base de connaissances de Microsoft . Cela ne se produit que lorsque ApplicationPoolIdentity est utilisé. Il se produit très facilement, c'est-à-dire après que le mot de passe du compte machine a été modifié (ce qui, par défaut, se produit automatiquement tous les 30 jours), puis qu'IIS a été redémarré (par exemple, par l'intermédiaire de iisreset ). Notez que le problème disparaît après un redémarrage, selon Microsoft et nos observations.

Selon Microsoft, il n'est pas possible de vérifier si votre Windows/IIS s'est mis dans cet état.

Microsoft a joint un correctif à cet article de la KB. Il n'y a aucune indication sur la date à laquelle ce correctif sera intégré dans une livraison officielle, et le correctif date déjà de 10 mois. Dans notre cas spécifique, nous avons décidé de passer à NetworkService à la place.

2voto

crimbo Points 572

Voir https://serverfault.com/a/403534/126432 pour mes commentaires sur le même problème/solution.

L'utilisation du correctif que vous avez indiqué m'a permis de faire fonctionner ApplicationPoolIdentity comme indiqué dans la documentation. Ce correctif ne décrit pas spécifiquement une solution pour accéder aux ressources du réseau en tant qu'AUTORITÉ NT. \ANONYMOUS LOGON, mais c'est lié au changement de mot de passe de l'ordinateur. L'essentiel est que cela a fonctionné pour moi, du moins jusqu'à présent.

0voto

StuartN Points 21

Ceci est également valable pour Umbraco qui utilise l'authentification Active Directory. De temps en temps, vous pouvez obtenir cette exception :

Erreur de configuration

L'attribut ou la valeur du service de répertoire spécifié n'existe pas.

Cela est apparemment causé par le problème décrit ici. Un redémarrage le résout invariablement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X