Accesso a file remoti via UNC: File.Exists sempre False

venerdì 07 aprile 2006 - 15.14

positron Profilo | Newbie

Ciao a tutti,
Dal mio IIS5 sul server_A (win2k server) cerco di accedere a un file sul server_B (win2k server) utilizzando in C#

File.Exists("\\\\server_B\\sharedFolder\\file.txt")

Il problema e' che il metodo restituisce sempre False, anche se il file in realta' esiste.
La prima cosa che viene in mente e' che si tratti di un problema di permessi, probabilmente da affrontare usando l'impersonation in qualche modo.
Il fatto e' che i due server non sono in un dominio e la cartella ha i permessi (lettura/scrittura) per... Everyone.

La cartella e il file sono perfettamente accessibili da un qualunque utente loggato sul server_A.

Qualche idea?
Grazie anticipatamente.

Paolo Marini

GvnnRules Profilo | Senior Member

Tu hai dato si i permessi a tutti gli utenti, ma probabilmente gli utenti hanno password differenti e quindi non passano. Prova a mettere su entrambi i server l'utente con cui esegui l'applicazione, con la stessa password e probabilmente funziona.

Peace
Gvnn

http://www.gvnn.it
http://www.sqlwebarchitect.org
http://blogs.dotnethell.it/gvnn/

Brainkiller Profilo | Guru

>Tu hai dato si i permessi a tutti gli utenti, ma probabilmente
>gli utenti hanno password differenti e quindi non passano. Prova
>a mettere su entrambi i server l'utente con cui esegui l'applicazione,
>con la stessa password e probabilmente funziona.

Secondo me è più corretta la satrada di Positron, cioè l'impersonation. Questo perchè l'applicazione Web viene eseguita con l'utente ASPNET che ha permessi limitati e non è detto che possa accedere a server remoti così semplicemente.

David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/

positron Profilo | Newbie

Sono finalmente riuscito a risolvere l'arcano, principalmente grazie alle seguenti risorse:
http://forums.asp.net/thread/716850.aspx
e
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vsent7/html/vxconaspnetdelegation.asp


Da quanto ho potuto capire, l'account ASPNET (sotto il quale gira per default aspnet_wp.exe) non ha alcun permesso di rete .
Questo concetto mi ha lasciato un po' perplesso perche', nella mia ignoranza, credevo che il Server_A (webserver) si presentasse al server remoto Server_B con un account da quest'ultimo non autenticabile, cioe' Server_A\ASPNET. A questo punto mi aspettavo che la richiesta esterna venisse risolta con l'uso dell'account Server_B\Everyone, per il quale i permessi per il file di mio interesse sono disponibili.
Questo era evidentemente incorretto in quanto l'accesso al file dalla pagina veniva comunque negato.

Sul secondo link che ho proposto si legge che la richiesta al server remoto viene risolta con l'account NT AUTHORITY\ANONYMOUS LOGON. A quel punto ho immediatamente provato ad assegnare a tale account sul Server_B i permessi necessari ma senza successo.
Premesso che avrei comunque preferito evitare tale soluzione, ho deciso di tentare la strada dell'impersonation nel seguente modo.

1. Ho aggiunto al web.config la seguente sezione:


<location path="myPath/pageThatMakesRemoteAccess.aspx"> <system.web> <identity impersonate="true" userName="myUsername" password="myPassword" /> </system.web> </location>

2. Ho definito myUsername su entrambi impostando sul Server_B i permessi necessari per accedere al file.

E HO RISOLTO!


In effetti la soluzione ideale potrebbe essere quella di assegnare a Server_A\myUsername gli stessi identici permessi di ASPNET, con l'aggiunta dell'accesso alle risorse di rete.
Non so ancora bene cosa la mia soluzione comporti, intendo, non so che pericoli/limiti possa correre nel far pascolare aspnet_wp.exe con un account diverso da ASPNET, ma per ora non vedo altro modo.

Paolo Marini

EDITED:
Credo che questo articolo sia essenziale in questo contesto:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/SecNetHT01.asp

Brainkiller Profilo | Guru

>Da quanto ho potuto capire, l'account ASPNET (sotto il quale
>gira per default aspnet_wp.exe) non ha alcun permesso di rete

Ciao Paolo,
gli utenti ASPNET e NETWORK SERVICE (rispettivamente gli account con cui girano le applicazioni Web sotto Windows 2000 e Windows 2003) sono stati creati appositamente per avere i minimi requisiti di sicurezza. Così se per un qualsiasi motivo dall'esterno qualcuno potesse sfruttare qualche bug di sistema non avrebbe accesso completo alla macchina, logicamente.

Se pensi che nè ASPNET nè NETWORK SERVICE posso no scrivere su disco mentre invece bisogna specificare i diritti appositi....

>Questo concetto mi ha lasciato un po' perplesso perche', nella
>mia ignoranza, credevo che il Server_A (webserver) si presentasse
>al server remoto Server_B con un account da quest'ultimo non
>autenticabile, cioe' Server_A\ASPNET. A questo punto mi aspettavo
>che la richiesta esterna venisse risolta con l'uso dell'account
>Server_B\Everyone, per il quale i permessi per il file di mio
>interesse sono disponibili.

Beh questo è normale non c'è niente di automatico. Non puoi passare di là come Everyone.

Eh esatto, la soluzione migliore è l'impersonation.
Anche se in alcuni casi può essere noiosa.
Si potrebbe anche lavorare tramite Remoting o Web Services, in modo da viaggiare su canale 80 o su altri canali senza impersonation.

Ciao

David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/

positron Profilo | Newbie

> Be' questo è normale non c'è niente di automatico. Non puoi passare di là come Everyone.

Grazie mille.
Solo alcune domande per chiarire i miei dubbi:
1. L'applicazione IIS sul server_A prova a presentarsi al server_B, oppure la richiesta non puo' neppure uscire dal server_A?

Se la richiesta puo' uscire:
2. Dal momento che l'account Server_A\ASPNET non puo' venire autenticato sul Server_B (a meno che non abbiamo la stessa password suppongo), cosa accade?
2.a L'accesso viene negato e basta.
2.b L'accesso viene effettuato come Everyone (mi hai gia' risposto di no).
2.c L'accesso viene effettuato come NT AUTHORITY\ANONYMOUS LOGON.

Leggendo l'articolo MS su http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vsent7/html/vxconaspnetdelegation.asp mi era parso di capire che la risposta fosse (2.c), infatti:

"When using <processModel userName="machine">, which is the default setting, ASP.NET attempts to delegate the ASPNET local user account. As this account does not possess any network credentials, to the network it appears as the Windows anonymous account (NT AUTHORITY\ANONYMOUS LOGON)."


Il fatto che anche impostando sul Server_B i permessi per AUTHORITY\ANONYMOUS LOGON non risolva il problema mi fa pensare che la risposta non sia quella.

Cosa ne pensi?

Paolo Marini

Brainkiller Profilo | Guru

>Il fatto che anche impostando sul Server_B i permessi per AUTHORITY\ANONYMOUS
>LOGON non risolva il problema mi fa pensare che la risposta non
>sia quella.

Anche NT AUTHORITY\ANONYMOUS è un utente particolare e non so se impostando i diritti come hai detto tu funziona. Per me funziona così come hai detto, la 2C ma bisognerebbe fare ulteriori prove per accedere in altro modo diverso dalla impersonation.
Di solito spesso ci si perde molto tempo per ovvi motivi
Ciao

David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5