3
votes

IIS ne parvient pas à transmettre les informations d'identification Windows à l'application SQL Server pour ASP.NET Core

Je travaille pour une grande entreprise avec un intranet et des connexions Windows AD pour tout le monde. Nous avons un certain nombre de bases de données internes SQL Server qui nous permettent de nous connecter à l'aide de l'authentification Windows, à laquelle j'essaie de me connecter via une application ASP.NET Core. Je peux me connecter à cette base de données via SQL Server Management Studio et interroger les tables correctement.

J'ai suivi le didacticiel pour un Application ASP.NET Core utilisant une base de données existante aussi étroitement que possible, et créé une classe de modèle unique avec laquelle tester pour voir si Je pourrais lire les données de la base de données. Lors du débogage avec IIS Express dans Visual Studio, je peux lire les données de la base de données lors de l'accès au contrôleur et aux vues générés automatiquement.

Tout semble bien lors du débogage, mais lors de la publication sur IIS, je reçois l'erreur suivante :

            services.AddDbContext<MyContext>(options => {
                options.UseSqlServer(Configuration.GetConnectionString("MyDB"));
            });

Où domain est mon domaine et computername est le nom de mon ordinateur. C'est normal, car mon ordinateur lui-même n'a pas accès à la base de données. Mais il ne devrait pas essayer de se connecter en utilisant ce compte système (avec le signe dollar), il devrait essayer de se connecter avec mon compte Windows: \ .

Ce qui est plus étrange, l'application semble reconnaître mes informations d'identification Windows dans une certaine mesure - lorsque j'accède à la page d'accueil, j'obtiens le familier "Bonjour, \ ! " message dans la barre de navigation. Ainsi, les informations d'identification Windows sont définitivement transmises à l'application, mais pour une raison quelconque, elles ne sont pas transmises lors de la tentative de connexion à la base de données via DbContext.

Suis-je en train de manquer quelque chose d'évident?

Mon code

J'ai commencé avec le modèle d'application Web ASP.NET Core de Visual Studio.

Dans launchSettings.json, j'ai:

  "ConnectionStrings": {
    "MyDB": "Server=<servername>;Database=<dbname>;Trusted_Connection=True;"
  },


7 commentaires

où déployez-vous votre application? avez-vous essayé de vous connecter au serveur SQL à partir de la machine sur laquelle vous déployez votre application? est SSMS sur cette machine?


Je supprimerais le paramètre "Trusted_Connection = True", car il fournit les informations d'identification de la machine. Je n'ai pas entendu parler d'informations d'identification passant par IIS-> ASP-> SQL Server. Il semble que vous deviez fournir des informations d'identification à un moment donné.


Actuellement, je le déploie sur IIS sur ma machine locale. J'ai essayé à la fois le déploiement du système de fichiers et le déploiement Web.


Vous pouvez essayer d'utiliser NetworkService au lieu d'ApplicationPoolIdentity. Si cela ne fonctionne pas ... configurez un utilisateur de base de données et fournissez les informations d'identification - juste comme un contrôle de cohérence


"Mais il ne devrait pas essayer de se connecter en utilisant ce compte système (avec le signe dollar), il devrait essayer de se connecter à mon compte Windows: \ ." Je ne sais pas d'où vous vient ce malentendu. blog.lextudio.com/…


@Lex Li - Je suppose que le point me manque alors, car le mode d'authentification IIS est défini sur Windows, et l'application Web peut voir mon nom d'utilisateur Windows, et les chaînes de connexion au serveur SQL de l'application sont définies pour utiliser une connexion approuvée, mais pour une raison pour laquelle l'application ne peut pas l'utiliser pour se connecter au serveur SQL? Quelle est la meilleure pratique dans cette situation si je veux permettre aux utilisateurs de l'intranet d'interroger la base de données?


Je crois comprendre que votre connexion à la base de données sera établie avec l'identité du pool d'applications (qui, je suppose, est par défaut \ $). Je pense que vous devez utiliser "Usurpation d'identité" pour lui permettre d'utiliser votre utilisateur connecté docs.microsoft.com/en-us/previous-versions/windows/it-pro/...


3 Réponses :


1
votes

Vous utilisez Entity-Framework pour SqlServer et EF utilise ADO.NET SqlClient. Par conséquent, Trusted_Connection = yes; ne fonctionne pas.

Ajoutez plutôt Integrated Security = true; et cela devrait être corrigé.

Voici quelques ressources pour en savoir plus https://docs.microsoft.com/ fr-fr / dotnet / framework / data / adonet / syntaxe-de-chaîne-de-connexion


2 commentaires

Malheureusement, la commutation de la connexion Integrated Security = true n'a pas fonctionné. Toujours obtenir la même erreur lorsqu'il essaie de se connecter en utilisant le compte intégré de mon ordinateur plutôt que mon utilisateur Windows réel. Cela se produit uniquement lorsqu'il est hébergé dans IIS, pas pendant le développement lors du débogage avec IIS Express.


J'ai essayé la suggestion de @ johnluke.laue ci-dessus, en utilisant un utilisateur et un mot de passe nommés pour me connecter à SQL Server à la place, et cela a fonctionné. Alors cela a au moins fourni un contrôle de cohérence. L'utilisation de NetworkService au lieu d'ApplicationPoolIdentity n'aide pas.



1
votes

Après en avoir appris davantage sur .NET et ce que fait réellement l'authentification Windows sur IIS, je vais dire que ce que j'essayais de faire n'est pas recommandé. Il y a une différence entre la transmission des informations d'identification Windows à une application .NET afin de les lire, et l'exécution d'un processus secondaire en tant qu'utilisateur. Ce dernier cas est ce que j'essayais de faire, mais je devrais plutôt configurer mon pool d'applications dans IIS avec un utilisateur qui peut se connecter à la base de données et utiliser les informations d'identification Windows pour vérifier la liste des utilisateurs qui y ont accès.


2 commentaires

Avez-vous un guide / référence de ce que vous avez réellement fait (configuration du pool d'applications, etc.)?


Salut, @Aias J'ai du mal à héberger l'application Web principale asp.net dans IIS avec l'application Windows et je suis très coincé. J'ai répondu à la question ici . Il semble que vous ayez pu y parvenir. Pouvez-vous m'aider à cet égard? Veuillez poster une réponse à cette question si vous savez comment résoudre ce problème. N'hésitez pas à commenter si vous avez besoin de plus de détails.



0
votes

Ne pas déterrer un ancien thread, mais c'est une fonction qui devrait fonctionner tant que Identity Impersonate = True est défini. Voici quelques éléments sur lesquels vous travaillez.

GitHub Doc


0 commentaires