Comment faire pour configurer IIS 7 identité du pool d'applications correctement?
Après avoir déployé mon site web IIS7.5 j'ai trouvé un étrange comportement: lorsque l'identité du pool d'applications est laissé à la ApplicationPoolIdentity
par défaut (comme recommandé dans Pool d'Applications IIS Identités), Ninject
semble être ignoré, car j'obtiens l'erreur suivante, lors de la création du tout premier contrôleur:
Système.InvalidOperationException: Une erreur s'est produite lors de la tentative de
créer un contrôleur de type
'..MainController'. Assurez-vous que
que le contrôleur a un sans paramètre constructeur public. --->
Système.DirectoryServices.DirectoryServicesCOMException: des opérations
erreur s'est produite.
J'ai essayé d'accorder FullAccess
à IIS AppPool\<MySiteAppPool>
le dossier contenant le site (y compris tous les sous-dossiers et fichiers), mais cela n'a pas changer quoi que ce soit.
Cependant, lorsque j'ai mis l'identité du pool d'applications pour tout compte de domaine (même simple, sans privilages administratives, ainsi que, sans accès au dossier avec le site), il fonctionne normalement.
Ninject est installé selon La configuration d'une application MVC3 tutoriel sur le package NuGet.
Je ne suis pas sûr, si c'est pertinent, le site est censé travailler dans un domaine intranet avec l'authentification windows.
Donc, le seul problème semble être avec l'identité du pool d'applications. Pour autant que je suis impatient de l'utiliser de la manière recommandée, j'aimerais bien avoir la ApplicationPoolIdentity
, pas un compte de domaine.
Ce que cela peut-il être connecté avec? Est-il possible de mélanger tous ces ensemble?
Voici un fil avec une question similaire: ASP.NET MVC 4 + Ninject MVC 3 = Pas de constructeur sans paramètre défini pour cet objet. Cependant l'absence de réponse à toutes les deux.
Comme la suppression du commentaire, il est proposé, j'ai essayé d'utiliser NetworkSerive
que l'identité. Et cela a fonctionné correctement. Cependant, je suppose que ce n'est pas beaucoup mieux, qu'un non-privilégiés de compte de domaine.
MODIFIER
Soudainement trouvé une autre dépendance: l'identité du pool d'applications est utilisé pour l'authentification windows sur sql server, mais j'avais prévu le côté client de l'utilisateur informations d'identification à utiliser.
Sur la base des observations
D'accord qu'un serveur sql server distant peut être consulté à l'authentifiés informations d'identification par imitation.
Cependant, il n'est pas encore clair quel est le problème avec ApplicationPoolIdentity et Ninject.
L'article mentiond au sommet de cette question m'a fait supposer que cela pourrait être causé par le fait, que compte virtuel n'a pas de profil utilisateur. Cet aspect reste pas clair pour moi, que l'on peut toujours activer IIS pour charger le profil de l'utilisateur avec le LoadUserProfile
attribut. Je n'arrive pas, qu'est-ce que IIS va charger, si il n'y a pas de profil pour le compte virtuel?
Il y est dit:
IIS n'a pas de charger le profil utilisateur de Windows, mais certaines applications
peut en profiter de toute façon pour le stockage temporaire de données. SQL Express
est un exemple d'une application qui fait cela. Toutefois, un utilisateur
le profil doit être créé pour stocker les données temporaires dans le
répertoire de profil ou dans la ruche de registre. Le profil de l'utilisateur pour la
Compte NETWORKSERVICE a été créé par le système et a toujours été
disponible. Cependant, avec le passage de Pool d'Applications unique
identités, aucun profil d'utilisateur est créé par le système. Seul le
Application standard Piscines (DefaultAppPool et Classique .NET pool d'applications)
les profils utilisateur sur le disque. Aucun profil d'utilisateur est créé si l'
L'administrateur crée un nouveau Pool d'Applications.Toutefois, si vous le souhaitez, vous pouvez configurer des Pools d'Applications IIS pour charger
le profil de l'utilisateur en définissant la "LoadUserProfile" attribut "true".
J'ai trouvé le fil de discussion suivant sur serverfault.com:
Il est également indiqué que le pool d'applications de l'identité est incapable de travailler comme un service de réseau, en particulier, à la requête de l'ANNONCE.
J'ai accordé
FullAccess
à IIS AppPool\<MySiteAppPool>
le dossier contenant le site (y compris tous les sous-répertoires et fichiers)Ok, avez-vous quelque chose de supplémentaire à apparaître dans les journaux des événements ?
Mon journal d'application ne reçoit que l'exception posté ci-dessus. Comme fr les journaux windows, je n'ai pas réussi à trouver quelque chose de convenable.
Vous pouvez quitter l'application de la piscine à ApplicationPoolIdentity et ensuite utiliser asp emprunt d'identité pour se connecter à votre base de données avec un utilisateur spécifique. Regardez la section "authentification" et vous le verrez. La clé est <identity impersonate="true" userName="" password="" /> dans votre site web.config.
OriginalL'auteur horgh | 2013-03-28
Vous devez vous connecter pour publier un commentaire.
Dans le détail de la question, il ressemble beaucoup à un problème d'autorisations provoquant une
COMException
être levée, ce qui empêche Ninject à partir de l'instanciation deMainController
. L'exception est liée àSystem.DirectoryServices
quelles sont les catégories utilisées pour interroger Active Directory.Lorsque IIS est en cours d'exécution selon les conditions d'application de la piscine comptes, les comptes n'ont pas les autorisations pour effectuer des requêtes sur Active Directory et un
COMException
peut être levée. Je pense que le message de l'exception (ne peut pas trouver un constructeur sans paramètre), c'est un peu un leurre et est Ninject essayer de revenir à une autre constructeur depuis le normal n'a pas fonctionné.Qui pourrait expliquer pourquoi, lorsque vous modifiez le pool d'applications IIS pour s'exécuter comme un compte de domaine soudain, elle fonctionne, parce que ce compte est autorisé à interroger le domaine.
Il n'est pas clair à partir de la question de savoir si vous êtes ou non à l'aide de
System.DirectoryServices
vous-même ou si Ninject/IIS/ASP. Si vous utilisez vous-même si, assurez-vous qu'aucun des constructeurs dans votre ANNONCE les classes peut lancer des exceptions (les attraper et de les connecter entre eux ou quelque chose) qui va empêcher votre application à partir de la plante au démarrage. Vous trouverez probablement ce que j'ai dit ci-dessus sur les autorisations.Si vous avez besoin de services internet (IIS) que la normale pool d'application compte (ce qui est une bonne idée), mais encore de requête AD tant qu'utilisateur de domaine, alors vous pouvez spécifier les informations d'identification
DirectoryEntry
et l'utilisation d'unDirectorySearcher
à faire la publicité de recherche. Si vous êtes sur .Net 4 ou plus, alors je vous recommande d'utiliser la nouvelleSystem.DirectoryServices.AccountManagement
classes à la place (qui vous permettent de spécifier des informations d'identification).Avec cette méthode, vous n'aurez pas besoin de l'emprunt d'identité pour les requêtes et votre pool d'application peut encore fonctionner que la normale pool d'application des comptes.
J'ai mis à jour ma réponse à préciser que l'usurpation d'identité n'est pas nécessaire pour une ANNONCE de recherche de et a supprimé les références sur le compte service réseau. C'était potentiellement trompeuse en raison de la différence entre l'habituel IIS application de la piscine de comptes (p. ex. ASP.Net v4.0) et compte NetworkService qui, comme vous le dites, sont légèrement différents.
Je pense que vous avez m'a orienté dans la bonne direction, comme je l'ai en effet accès AD et ce doit être la raison pour laquelle exécute sous un compte virtuel est un échec. Je vais vérifier tout cela dès que possible.
La discussion d'un même problème, je pense: Comment puis-je attribuer autorisation active directory par défaut par l'application d'identité du pool d'
OriginalL'auteur Adam Rodger
iispool\appPoolName compte sont appelés les comptes virtuels & ont été ajoutées à Windows 2008. L'idée est que ils ne sont pas vraiment des comptes dans le vrai sens du terme. Ce qu'ils permettent est sécurité renforcée entre les processus à l'aide de la base de compte.
De nombreux services sur votre utilisation de la machine networkService, construit dans le compte d'accès au réseau. De ce fait, si un attaquant ont été d'exploiter l'un de ces services, tous les autres processus en cours d'exécution sous le même compte, seraient accessibles. Les comptes virtuels, tels que ceux utilisés par IIS éviter cela en apparaissant comme des comptes différents, tout en restant dans le même compte - votre asp.net l'application est toujours techniquement en cours d'exécution en tant que service réseau & que l'octroi de ce compte de l'accès aux choses devraient encore du travail. Cela signifie également que si vous avez besoin d'accéder à des ressources réseau, la iispool comptes le faire en tant que service réseau n' & utiliser les machines de compte de domaine.
Si vous accédez à un serveur sql server distant, c'est le compte que vous devez ajouter à permettre l'accès à partir de votre serveur web. Je ne le conseille pas à l'aide de l'usurpation d'identité, à moins que vous vraiment besoin de voir qui est l'utilisateur sur le serveur SQL. Votre application de sécurité est plus simple si vous la laisser de côté.
la raison pour laquelle vos injections ne sont pas de travail, il pourrait être l'un de vos dépendances défaut. si controllerA est injecté avec ClassB qui est injecté avec ClassC & que la classe n'est pas ClassD injecté, puis l'ensemble de la chaîne d'échec. J'ai déjà arrivé & il a fallu un certain temps pour réaliser que c'était quelque chose de tellement éloignés de ce que je regardais.
OriginalL'auteur Simon Halsey