Proteggere Cartelle Applicazione ASP. Net su aruba.

mercoledì 12 marzo 2008 - 17.15

EnricoF Profilo | Newbie

Salve. Ho creato un'applicazione in ASP .Net 2.0 che gestisce l'acquisto e il download di file musicali. I file mp3 vengono copiati da una cartella dell'applicazione, zippati e da li ne viene consentito il download per gli utenti che hanno effettuato regolare pagamento. Il sito è ospitato su aruba. Il problema è che digitando il percorso virtuale corretto dei file mp3 sul server (per esempio http://www.dominio.it/risorse/mp3/NomeMp3File.mp3) i file musicali vengono tranquillamente eseguiti ed è possibile ascoltarli e scaricarli. Qual'è il modo migliore per assegnare al processo di ASP .Net i necessari permessi su determinate cartelle contenenti file di risorsa (come i file musicali) impedendo però a terzi di esplorare, scaricare, eliminare, modificare ed eseguire i file contenuti nelle stesse cartelle? (considerando che il tutto deve avvenire sul server di aruba).

amelix Profilo | Expert

Su aruba hai delle cartelle (mdb-database credo e App_Data) che sono in scrittura e non possono essere accessibili dall'esterno con un url normale.

Per inviare il file ti conviene fare un .ashx (Generic Handler) che ti faccia il flush del file solo a chi è loggato.

Andrea - http://www.MelisWeb.eu/
CMS - http://www.WebOrama.it/

freeteo Profilo | Guru

ciao,
oppure puoi lavorare con la Asp.net Authentication Forms, e le "location" impostabili nel "web.config" e impostare una diversa autorizzazione per chi richiede qualsiasi cosa dentro a quella dir.

Esempio:

<system.web> ... <authentication mode="Forms"> <forms name="sito" protection="All" loginUrl="~/login.aspx"> </forms> </authentication> <authorization> <allow users="?"/> <allow users="*"/> </authorization> .... <location path="directoryProtetta"> <system.web> <authorization> <deny users="?"/> <allow users="*"/> </authorization> </system.web> </location>

in questo caso il sito normalmente è accessibile a tutto ( allow "*" e "?" quindi loggati e non ) mentre invece la dir "directoryProtetta" è accessibile solo per quelli loggati ( allow "*" )
Chiunque chiami qualcosa dentro a quella dir viene prima rediretto alla pagina "login.aspx" e quindi deve essere verificato tramite codice ad esempio, e poi rediretto dove voleva andare tramite " FormsAuthentication.RedirectFromLoginPage(... ) "

ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

EnricoF Profilo | Newbie

Ciao, Ti ringrazio della tua attenzione. Ho verificato e in effetti i file mp3 nella cartella App_Code non vengono eseguiti.
Da codice ASP .NET posso, attraverso lo spazio dei nomi System.IO copiare i file da una sottocartella di App_Code nella cartella public, zipparli ed eseguirne il download esattamente come faccio ora ma da una cartella diversa da App_Code che contiene appunto quei file mp3 che però potevano essere eseguiti digitando semplicemente l'url?

amelix Profilo | Expert

X Matteo... non credo proprio(in questo caso )... il web.config e l'autenticazione vencono scatenati SOLO su oggetti dotNet.
Se tu avessi il potere di modificare IIS (e questo non è il caso... sono su aruba) o hai IIS 7.0 (idem) ti darei ragione.

Ma, per i barboni come me, ci vogliono degli accrocchi...
Io uso un Download.ashx (che segue le regole di Matteo) e gli passo il nome del file x esempio:
http://localhost/Download.ashx?file=mia.mp3

Nel file devi aprire il file in questione e fare lo streem dei dati.

In questo esempio:
http://www.dotnetside.org/blogs/tips/archive/2007/06/13/HttpHandler-per-un_2700_immagine-casuale.aspx

Fa una cosa simile ma x le immagini...

Andrea - http://www.MelisWeb.eu/
CMS - http://www.WebOrama.it/

freeteo Profilo | Guru

ciao,
Errata Corrige: ha completamente ragione amelix, chiedo perdono
Quello che ti ho scritto io è teorico che non trova funzionalita' effettiva fino all'utilizzo di IIS7.


Io pensavo alla soluzione, specificando nel web.config la mappatura dell'httphandler, in questo modo:
<httpHandlers> <add verb="*" path="*.mp3" validate="True" type="System.Web.DefaultHttpHandler" /> </httpHandlers>

non funzionano, ed io invece erroneamente pensavo funzionassero.
Percio' do pienamente ragione ad amelix, e confermo ankio il consiglio dell'implementazione dell'ashx, il quale dopo l'authenticazione, ti dia poi lo stream di dati in uscita di quel file che vuoi scaricare...


Per quanto riguarda iis7 invece, si comporta come dicevo io, con l'aggiunta nel webconfig nella sezione "system.webServer" del tuo handler:
<system.webServer> <handlers> <add verb="*" path="*.mp3" name="mio" type="System.Web.DefaultHttpHandler" /> </handlers> </system.webServer>

e quindi la mappatura dell'estensione passa per la login etc...peccato, nelle versioni precedenti ad IIS7 non si puo' fare da web.config, devi mappare l'estensione in IIS e quindi su aruba dato che non hai l'accesso cosi' amministrativo non lo puoi fare...


ps: a quanto vedo su aruba il file ".mp3" inoltre è proprio mappato su IIS:
http://support.aruba.it/kb/idx/52/147/00002Languages-and-Web-Space/article/MIME-mapped-on-IIS-in-Hosting-Windows-2003.html

ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

white71j Profilo | Newbie

ho + o meno lo stesso problema solo che la mia cartella da proteggere contiene file pdf ed è una directory virtuale (per cui fisicamente non è detto che risieda sulla root); inoltre l'applicazione gira su un server che posso gestire in autonomia... cosa dovrei fare su iis??
Ho implementato un httphandler che dovrebbe filtrare le richieste http sui pdf per gli utenti autenticati, per cui se effettuo una richiesta via browser del file senza effettuare un login, non dovrei avere accesso al file. La cosa strana è che in locale funziona, ma una volta che testo il tutto sul server di produzione sembra ignorare il mio httphandler....
Sono disperato... aiutatemi!!!

freeteo Profilo | Guru

ciao,
se puoi gestire iis, hai gia' provato a mappare l'estensione "pdf" nella configurazione delle "estensioni applicazioni" che sia gestito da asp.net?
Questo per dire di passare al framework (isapi dll) la richiesta per quel file, e quindi passare per il tuo handler...cosa che il webserver locale dove testi i progetti (che lancia visual studio appena fai F5) è mappato per gestire tutto...ovvio che è solo per test mentre iis è molto piu' completo...pero' dovrebbe funzionare...

ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

white71j Profilo | Newbie

Grazie per l'aiuto. Ho provato a fare quello che mi dici, ma ora non riesco a visualizzare il pdf nemmeno se sono loggato. In pratica mi restituisce un errore sul web.config se richiamo il file pdf da browser, che è il seguente:

Could not load file or assembly 'MagicAjax' or one of its dependencies. Impossibile trovare il file specificato

quello che segue è il pezzo di codice del web.config

<httpModules>
<add name="MagicAjaxModule" type="MagicAjax.MagicAjaxModule, MagicAjax"/>
</httpModules>

<httpHandlers>
<add verb="*" path="reportFiles/pdf/*.pdf" type="Myproject.Common.FileHandler" />
<add verb="GET" path="reportFiles/pictures/*.gif" type="Myproject.Common.FileHandler" />
<add verb="GET" path="reportFiles/pictures/*.jpg" type="Myproject.Common.FileHandler" />
<add verb="GET" path="reportFiles/pictures/*.jpeg" type="Myproject.Common.FileHandler" />
<add verb="GET" path="reportFiles/pictures/*.png" type="Myproject.Common.FileHandler" />
</httpHandlers>
<pages>
<controls>
<add namespace="MagicAjax.UI.Controls" assembly="MagicAjax" tagPrefix="ajax"/>
</controls>
</pages>

Ribadisco che viceversa in locale il tutto funziona correttamente.
Il problema può essere dovuto al modulo ajax che utilizzo nell'applicazione?
Esiste una maniera per visualizzare un'anteprima del pdf in una pagina aspx anzicchè richiamarla tramite url direttamente (così forse potrei evitare il problema)

Grazie ancora
Flavio

freeteo Profilo | Guru

>Ribadisco che viceversa in locale il tutto funziona correttamente.
>Il problema può essere dovuto al modulo ajax che utilizzo nell'applicazione?
si vedendo l'errore è chiaro che non trova la dll di magiajax nella bin, ma hai fatto il deploy corretto?
Puoi farlo con un progetto di setup o compilando (pubblicazione) in una dir locale temporanea e poi copiando sul server tutti i file compilati.


>Esiste una maniera per visualizzare un'anteprima del pdf in una
>pagina aspx anzicchè richiamarla tramite url direttamente (così
>forse potrei evitare il problema)
diciamo di no, nel senso che cmq il visualizzatore deve girare sul computer client tramite il suo browser...quindi di fatto è cmq un url accessibile dal client.


ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

white71j Profilo | Newbie

>>Ribadisco che viceversa in locale il tutto funziona correttamente.
>>Il problema può essere dovuto al modulo ajax che utilizzo nell'applicazione?
>si vedendo l'errore è chiaro che non trova la dll di magiajax
>nella bin, ma hai fatto il deploy corretto?
>Puoi farlo con un progetto di setup o compilando (pubblicazione)
>in una dir locale temporanea e poi copiando sul server tutti
>i file compilati.

Mi pare strano perchè sulle altre pagine dell'applicazione non ho il problemae la dll funziona correttamente... ad ogni modo ho ricompilato e ricopiato sul server tutte le dll del progetto, ma nulla da fare.

Ho modificato il mio progetto eliminando il controllo ajax... ora il problema è cambiato e praticamente mi dà il seguente errore

Could not load type MyProject.Common.FileHandler'.

sempre nel web.config alla riga seguente:

<add verb="*" path="*.pdf" type="MyProject.Common.FileHandler" />

in cui MyProject.Common è il namespace della classe FileHandler

>
>
>>Esiste una maniera per visualizzare un'anteprima del pdf in una
>>pagina aspx anzicchè richiamarla tramite url direttamente (così
>>forse potrei evitare il problema)
>diciamo di no, nel senso che cmq il visualizzatore deve girare
>sul computer client tramite il suo browser...quindi di fatto
>è cmq un url accessibile dal client.
>
>
>ciao.
>
>Matteo Raumer
>[MCAD .net]
>http://blogs.dotnethell.it/freeteo

Flavio
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