L'application IIS utilisant l'identité du pool d'applications perd le token primaire?
(c'est une question sur un problème vague. J'essaie de présenter toutes les données pertinentes, dans l'espoir que quelqu'un a des informations utiles; excuses pour la longue description.)
notre application web
nous avons une application web .NET 4 fonctionnant dans IIS 7.5 accédant à Active Directory et une base de données SQL Server.
cette application web fonctionne sous une "identité de pool d'applications" virtuelle, en définissant la Identité du pool d'applications de la demande à ApplicationPoolIdentity . Une description concise des identités virtuelles peut être trouvée dans une réponse StackOverflow , et le billet de blog auquel il se réfère: une identité de pool d'applications est juste un groupe supplémentaire qui est ajouté aux processus de travail de l'application web qui est en cours d'exécution en tant que 'service réseau'. Cependant, une source , évoque vaguement que "le Réseau de Service et de Application IIS.net les documents du site ne sont pas publiés."Ainsi, une identité virtuelle pourrait être plus qu'un groupe supplémentaire.
nous avons choisi D'utiliser ApplicationPoolIdentity, par opposition à NetworkService, parce qu'il est devenu le 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 permissions qui se rapportent uniquement à l'identité sous laquelle le application pool est en cours d'exécution, augmentant ainsi la sécurité du serveur."(de processModel Élément pour ajouter de applicationPools [IIS 7 Schéma des Paramètres] ) "Pool d'Identités sont une nouvelle et puissante fonction d'isolation" qui est "de rendre la gestion d'applications IIS encore plus sûr et plus fiable. "(de IIS.net l'article "Pool d'Identités" )
L'application utilise L'authentification intégrée de Windows, mais avec <identity impersonate="false"/>
, de sorte que ce n'est pas l'identité de l'utilisateur final mais l'identité du pool d'applications virtuelles qui est utilisée pour exécuter notre code.
cette application interroge Active Directory en utilisant le système .DirectoryServices classes, i.e., L'API ADSI. Dans la plupart des endroits, cela se fait sans spécifier un nom d'utilisateur/mot de passe supplémentaire ou d'autres justificatifs d'identité.
cette application se connecte également à une base de données SQL Server en utilisant Integrated Security=true
dans le chaîne de connexion. Si la base de données est locale, alors nous voyons que IIS APPPOOLOurAppPoolName
est utilisé pour se connecter à la base de données; si la base de données est distante, alors le compte machine OURDOMAINourwebserver$
est utilisé.
nos problèmes
nous avons régulièrement des problèmes où une installation de travail commence à tomber en panne de l'une des façons suivantes.
-
lorsque la base de données est sur un système distant, puis la base de données la connexion commence à échouer: "Login failed for user' NT AUTHORITYANONYMOUS LOGON'. Raison: la validation D'accès au serveur basée sur un Token a échoué avec une erreur d'infrastructure. Vérifiez les erreurs précédentes."L'erreur précédente est "Erreur: 18456, Gravité: 14: 11."Il semble donc que maintenant
OURDOMAINourwebserver$
n'est plus utilisé, mais plutôt l'accès anonyme est tentée. (Nous avons des preuves anecdotiques que ce problème est survenu lorsque L'UAC a été désactivé et qu'il a disparu après avoir activé L'UAC. Mais la note que changer UAC nécessite un redémarrage...) Un problème similaire est rapporté dans IIS.net thread "utilisation ApplicationPoolIdentity pour se connecter à SQL" , particulièrement dans une réponse . -
Active Directory opérations via ADSI (Système d'.DirectoryServices) commencent à échouer avec l'erreur 0x8000500C ("Erreur inconnue"), 0x80072020 ("une erreur d'exploitation s'est produite."), ou 0x200B ("l'attribut de service de répertoire spécifié ou la valeur n'existe pas").
-
Se connecter à L'application à partir D'Internet Explorer commence à échouer, avec des erreurs HTTP 401. Mais si dans IIS nous mettons ensuite NTLM avant de négocier alors il fonctionne à nouveau. (Notez que L'accès à la publicité est nécessaire pour Kerberos mais pas pour NTLM.) Un problème similaire est rapporté dans IIS.net thread "Fenêtre d'Authentification à Défaut avec de l'Identité du pool d'applications" .
Notre hypothèse et la solution de contournement
au moins, les problèmes de publicité et de connexion semblent toujours disparaître lorsque l'on passe du pool d'applications Poolidentity Applicationà NetworkService. (Nous avons trouvé un rapport confirmant ceci.)
Page "dépannage des problèmes D'authentification sur les pages ASP" a quelques suggestions concernant les clés primaires et secondaires, et ce que je trouve ce qui est encourageant, c'est qu'il relie les deux premières erreurs: il mentionne NT AUTHORITYANONYMOUS LOGON
accès, et les erreurs de publicité 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 c'est sans rapport.)
sur la base de ce qui précède, notre hypothèse de travail actuelle 1519820920 " est que, seulement lorsque fonctionnant sous une identité de pool d'applications virtuelles, notre application web (IIS? processus de travail?) perd soudainement son token primaire , de sorte que IIS n'a qu'un token secondaire, de sorte que tout accès à Active Directory et SQL Server est fait de manière anonyme, conduisant à toutes les erreurs ci-dessus.
pour l'instant, nous avons l'intention de passer de L'Entitépolitique de L'application au service des réseaux. Avec un peu de chance, tous les problèmes ci-dessus disparaîtront. Mais nous ne sommes pas sûrs; et nous aimerions pour revenir en arrière si possible.
notre question
l'hypothèse ci-dessus est-elle correcte, et si oui, s'agit-il d'un bug dans IIS/Windows/.NET? Dans quelles circonstances cette perte de jeton primaire se produit-elle?
3 réponses
par Microsoft Support j'ai découvert que nous avons couru dans la question décrite dans article de base de connaissances de Microsoft KB2545850 . Cela ne se produit que lorsque L'Entitépolitique D'application est utilisée. Il se produit très facilement, à savoir, après le mot de passe du compte machine est changé (qui par défaut se produit automatiquement tous les 30 jours), puis IIS est redémarré (par exemple, par iisreset
). Notez que le problème disparaît après un redémarrage, selon Microsoft et notre observation.
selon Microsoft il n'est pas possible de vérifier si votre Windows/IIS est entré dans cet état.
Microsoft a un hotfix attaché à cet article de KB. Il n'y a aucune indication de la date à laquelle le mélange chaud sera incorporé dans une livraison officielle, et le mélange chaud a déjà 10 mois. Dans notre cas précis, nous avons décidé de passer au service des réseaux.
voir https://serverfault.com/a/403534/126432 pour mes commentaires sur le même problème/solution.
en utilisant le correctif que vous avez lié pour m'a permis D'obtenir ApplicationPoolIdentity travailler comme les docs disent qu'il devrait. Ce hotfix ne décrit pas spécifiquement une solution pour accéder aux ressources du réseau comme NT AUTHORITY\ANONYMOUS LOGON, mais il est lié au changement de mot de passe de l'ordinateur. En fin de compte, ça a marché pour moi, du moins jusqu'à présent.
ceci est également pertinent pour Umbraco en utilisant L'authentification Active Directory. De temps en temps, vous pouvez obtenir cette exception:
Erreur De Configuration
l'attribut ou la valeur de service d'annuaire spécifié n'existe pas
ceci est apparemment causé par le problème décrit ici. Un redémarrage le corrige invariablement.