Domanda

Ho un sito web ASP.NET su un server Windows 2003, che ha bisogno di accedere ai file da una condivisione di rete. La condivisione di rete è protetto da password e ha bisogno di un nome utente e una password da fornire.

Io uso le forme di autenticazione basata sul sito web e non basati su Windows.

Quindi il mio problema è che quando cerco di leggere qualsiasi file dal networkshare usando il codice seguente, viene generata l'accesso negato DirectoryInfo networkshare = new DirectoryInfo ( "\\ TestServer \ Share");

Così ho provato ad utilizzare Rappresenta, fornendo il nome utente e la password della condivisione di rete per la chiamata di funzione impersonate, tuttavia la chiamata non riesce, ovviamente, dal momento che il nome utente non esiste sul server web ASP.NET. Allora ho passato il nome utente e la password di un account di accesso che non esiste sul server web, quindi questa volta la chiamata impersonate funziona tuttavia ancora non è possibile accedere alla condivisione di rete 'cuz il nome utente e la password di condivisione di rete sono diverse.

Così alla fine, ho creato il nome utente esatto stesso / password sul server web, che corrisponde alla condivisione di rete. Questa chiamata di funzione impersonate tempo funziona e così fa parte della rete. Sono in grado di leggere correttamente dalla condivisione.

Quindi la mia domanda è: esiste un modo per leggere la condivisione di rete senza aggiungere il nome utente nel server web. 'Cuz ogni volta che il network modifiche quota di accesso, dovrò fare ancora una volta un nuovo nome utente nel server web troppo. Il che non è l'ideale.

Tutte le idee?

È stato utile?

Soluzione

Il modo "giusto" per farlo è quello di eseguire AppPool del webserver come l'identità in grado di accedere alla condivisione. In questo modo, l'unico archiviazione delle credenziali è fatto in modo sicuro nella configurazione di IIS (piuttosto che nel codice o nei file di configurazione leggibili). Mettere il server web e fileserver nello stesso dominio di Windows (o diversi domini con trust) è il modo più semplice, ma la cosa "stesso nome utente / password" dovrebbe funzionare anche lì.

Se non si cura di mettere nomi utente / password nel codice o di configurazione, è possibile P / Invoke per WNetAddConnection2 e passare il nome utente / da password, allora si dovrebbe essere in grado di accedere alla condivisione. Questo non richiede il server web di avere un conto di corrispondenza, ma in realtà dovrebbe fissare la password (guardare in System.Security.Cryptography.ProtectedData per lo stoccaggio del Registro criptato).

Altri suggerimenti

provare questo

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

request.GetResponse();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top