Question

J'ai un site Web ASP.NET sur un serveur Windows 2003, qui a besoin d'accéder à des fichiers à partir d'un partage réseau. Le partage réseau est protégé par mot et a besoin d'un nom d'utilisateur et mot de passe à fournir.

J'utiliser les formulaires d'authentification sur le site et non basé sur Windows.

Donc mon problème est, lorsque je tente de lire un fichier à partir du networkshare en utilisant le code ci-dessous, il jette un accès refusé DirectoryInfo NetworkShare = new DirectoryInfo ( "\\ TestServer \ Share");

J'ai essayé d'utiliser Impersonate en fournissant le nom d'utilisateur et mot de passe du partage réseau à l'appel de la fonction usurper l'identité, mais l'appel échoue évidemment depuis que le nom d'utilisateur n'existe pas sur le serveur Web ASP.NET. Alors je suis passé le nom d'utilisateur et mot de passe d'une connexion qui existe sur le serveur Web, cette fois l'appel impersonate fonctionne mais il ne peut toujours pas accéder au partage réseau « cuz le nom d'utilisateur partage réseau et le mot de passe sont différents.

Alors finalement, j'ai créé exactement le même nom d'utilisateur / mot de passe sur le serveur Web qui correspond à la part du réseau. Cette fois appel de fonction impersonate fonctionne et le fait partage réseau. Je suis capable de lire avec succès de la part.

Alors ma question est, est-il un moyen que je peux lire le partage réseau sans ajouter le nom d'utilisateur dans le serveur Web. « Cuz chaque fois que le réseau change de connexion de part, je vais devoir faire à nouveau un nouveau nom d'utilisateur dans le serveur Web aussi. Ce qui est pas idéal.

Toutes les idées?

Était-ce utile?

La solution

La « bonne » de le faire est d'exécuter AppPool du serveur Web comme l'identité qui peut accéder au partage. De cette façon, le seul stockage des titres de compétences se fait en toute sécurité dans la configuration IIS (plutôt que dans votre code ou dans des fichiers de configuration lisibles). Mettre le serveur web et serveur de fichiers dans le même domaine Windows (ou des domaines différents avec confiance) est la meilleure façon, mais la chose « même nom d'utilisateur / mot de passe » doit travailler là-bas aussi.

Si vous ne se soucient pas de mettre les noms d'utilisateur / mots de passe dans votre code ou config, vous pouvez P / Invoke pour WNetAddConnection2 et passer le nom d'utilisateur / alors vous devriez par mot de passe être en mesure d'accéder au partage. Cela ne nécessite pas le serveur Web d'avoir un compte correspondant, mais vous devriez vraiment obtenir le mot de passe (regarder dans System.Security.Cryptography.ProtectedData pour le stockage de registre crypté).

Autres conseils

essayer

WebRequest request = WebRequest.Create( "http://server/file.xml" );
request.PreAuthenticate = true;
request.Credentials = new NetworkCredential( "user", "pass" );

request.GetResponse();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top