Mon application Web ASP.NET v3.5 génère l'exception suivante lorsqu'elle tente d'ouvrir une connexion à une base de données SQL Server 2008:
System.Data.SqlClient.SqlException: Impossible d'ouvrir la base de données "MyDbName" Demandée par le login. La connexion A échoué. Échec de la connexion pour l'utilisateur 'NT AUTHORITY\IUSR'.
Le fait est que j'ai ajouté NT AUTHORITY\IUSR
à la liste des connexions du serveur et à la liste des utilisateurs de la base de données. Pour le serveur, j'ai attribué à l'utilisateur le rôle Public et, pour la base de données, les autorisations db_datareader
.
J'ai également accordé la même chose pour NT AUTHORITY\NETWORK SERVICE
, qui est l'identité sous laquelle le pool d'applications est exécuté.
L'application Web est hébergée par IIS7, si cela fait une différence. Le problème se répète lorsque la base de données et IIS se trouvent également sur le même ordinateur physique.
Le truc ici est que NT AUTHORITY\NETWORK SERVICE
apparaît réellement dans la base de données sous la forme DOMAINNAME\MACHINENAME$
(notez le signe $
!). En d'autres termes, lorsque vous franchissez la limite d'ordinateur entre votre serveur Web et SQL Server, SQL Server voit le compte d'ordinateur si vous utilisez les comptes NETWORK SERVICE
ou LOCAL SYSTEM
. Si vous utilisez un autre compte hors domaine, SQL Server ne recevra pas vos informations d'identification.
Je suis un peu perplexe par votre message d'erreur. À vrai dire, je ne pense pas que lorsque la base de données est sur une autre boîte, vous verrez autre chose que Login Failed for NT AUTHORITY\ANONYMOUS LOGON
.
IUSR
est utilisé pour les sites Web anonymes et ne peut pas être transmis à SQL Server. Vous trouverez peut-être un moyen de fonctionner si vous faites tout sur la même machine, mais je ne le saurai jamais car je ne le ferais jamais de cette façon ... ;-)
Je suggérerais de créer un compte séparé (de préférence un domaine) et de le spécifier dans la chaîne de connexion (généralement dans web.config) . Vous pouvez ensuite limiter les autorisations sur le serveur Web que ce compte peut et ne peut pas faire. ____.] Ensuite, vous pouvez accorder à ce compte les autorisations requises dans SQL Server.
J'avais eu le même problème et je l'avais résolu en modifiant le pool d'applications.
Au cas où cela aiderait quelqu'un, dans web.config, j'ai ajouté <identity impersonate = "false" /> pour que cette erreur disparaisse (sous <system. Web>).
Au lieu d'utiliser Integrated Security=True;
dans la chaîne de connexion, utilisez simplement l'authentification par nom d'utilisateur et mot de passe user=sa; pwd=mypassword;
Il est important de noter que vous obtiendrez cette erreur, comme je viens de le faire, si vous n'avez pas configuré IIS pour autoriser l'emprunt d'identité, mais si vous avez votre Web.config qui tente de l'emprunter.
Je viens de rencontrer cette erreur exacte et toutes les étapes suivantes sont obligatoires (mais il me manquait la première étape:
1.) Assurez-vous que l'emprunt d'identité ASP.NET est activé sur votre serveur Web IIS:
2.) Combinez cela avec la configuration de votre site pour utiliser l'emprunt d'identité (web.config):
<system.web>
<identity impersonate="true" userName="your_service_acct" password="***" />
3.) Les étapes ci-dessus supposent que vous avez une configuration de connexion SQL sur votre MSSQL pour 'votre_service_acct' avec des autorisations.
Lors de l'exécution sur localhost, contre une base de données locale ou même une base de données distante sur laquelle vous possédez personnellement des autorisations, le développement IIS se déroule comme si c'était VOUS - et tout fonctionne comme par magie. Ainsi, en mode débogage, vous n'avez pas besoin de créer un fichier web.config spécial.
Dès que vous déploierez votre site sur un type de serveur (dans mon cas, notre environnement TEST), vous devrez probablement avoir effectué les étapes ci-dessus que je viens de détailler, car IIS essaiera de se connecter en tant que utilisateur du pool d’applications, ce qui n’est généralement pas ce que vous voulez administrativement. Vous devez donc commencer à utiliser web.config transformations . Visual Studio insère donc le identity impersonate="true"
approprié lors de l'étape de déploiement "Publier ...".