2009-09-30 8 views
0

J'ai un site Web ASP.NET sur un serveur Windows 2003 qui doit accéder aux fichiers d'un partage réseau. Le partage réseau est protégé par mot de passe et nécessite un nom d'utilisateur et un mot de passe à fournir. J'utilise l'authentification basée sur les formulaires sur le site Web et non basé sur Windows. Donc, mon problème est, quand j'essaie de lire un fichier de la part du réseau en utilisant le code ci-dessous, il renvoie l'accès refusé DirectoryInfo networkShare = new DirectoryInfo ("\\ TestServer \ Share");ASP.NET Lire des fichiers à partir d'un partage réseau protégé par mot de passe

J'ai donc essayé d'utiliser Impersonate en fournissant le nom d'utilisateur et le mot de passe du partage réseau à l'appel de fonction impersonate, mais l'appel échoue évidemment puisque ce nom n'existe pas sur le serveur Web ASP.NET. Alors j'ai passé le nom d'utilisateur et le mot de passe d'un login qui existe sur le serveur web, donc cette fois l'appel d'identité fonctionne mais il ne peut toujours pas accéder au partage réseau parce que le nom d'utilisateur et le mot de passe sont différents. Finalement, j'ai créé exactement le même nom d'utilisateur/mot de passe sur le serveur Web qui correspond au partage réseau. Cette fois, l'appel de fonction d'usurpation d'identité fonctionne, tout comme le partage réseau. Je suis capable de lire avec succès de la part. Donc, 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 la connexion au partage de réseau change, je vais devoir à nouveau créer un nouveau nom d'utilisateur sur le serveur web. Ce qui n'est pas idéal.

Des idées?

Répondre

2

La « bonne » façon 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 informations d'identification est effectué de manière sécurisée dans la configuration IIS (plutôt que dans votre code ou dans les fichiers de configuration lisibles). Mettre le serveur web et le serveur de fichiers dans le même domaine Windows (ou dans des domaines différents avec confiance) est le moyen le plus simple, mais le "même nom d'utilisateur/mot de passe" devrait également fonctionner ici. Si vous ne vous souciez pas de mettre des noms d'utilisateur/mots de passe dans votre code ou config, vous pouvez P/Invoke to WNetAddConnection2 et passer le nom d'utilisateur/mot de passe - alors vous devriez être en mesure d'accéder au partage. Cela ne nécessite pas que le serveur Web ait un compte correspondant, mais vous devez vraiment sécuriser le mot de passe (consultez System.Security.Cryptography.ProtectedData pour le stockage de registre chiffré).

+0

Encore une fois, nous devons avoir un nom d'utilisateur/mot de passe identi- que sur les deux serveurs, n'est-ce pas? Je cherche quelque chose qui ne m'oblige pas à créer un nom d'utilisateur sur le serveur web. Merci. btw, mon partage réseau est sur un FEDORA et non un serveur Windows, je ne sais pas si cela fait une différence. – ace

+0

Désolé, votre message d'origine n'était pas clair - si vous ne vous souciez pas de stocker le nom d'utilisateur/mot de passe de l'autre serveur, j'ai ajouté quelque chose au-dessus qui devrait fonctionner. – nitzmahone

+0

Wow ... ressemble aux solutions à mon problème ... Je vais essayer de vous faire savoir si cela fonctionne. Merci l'homme ... Je pense crypter le login réseau et stocker sur le serveur de base de données, donc je suppose que ça devrait aller. – ace

0

essayer cette

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

request.GetResponse(); 
+0

J'ai besoin d'obtenir une liste de tous les fichiers du dossier de partage réseau et de copier tous les fichiers sur le serveur web, cela sera-t-il possible avec l'approche ci-dessus? Merci. – ace

Questions connexes