IIS7 - Impedire il download inserendo l'indirizzo direttamente in quer...

mercoledì 08 maggio 2013 - 13.18

zseven Profilo | Senior Member

Ciao ragazzi,
credo sia un problema di IIS.

Ho una applicazione web based che archivia in una cartella public tutta una serie di file di vario tipo.
Posso impostare da IIS che i file presenti in questa cartella devono poter essere aperti solo dall'applicazione e mai inserendo direttamente l'indirizzo sulla querystring?

GRAZIE!!

freeteo Profilo | Guru

Ciao,
che applicazione hai, puoi e sai metterci mano?

Se sì, io ti sconsiglio di fare troppe configurazioni su IIS, perchè nel caso un domani ti trovi a spostarlo devi andare a rimettere mano alla configurazione...e se cambi host potresti non avere accesso a certe features.

Ti suggerisco invece di mettere la cartella sotto sicurezza per gli anonimi, se imposti authentication/autorization nel config, di default tutte le cartelle sotto alla root della tua applicazione lo sono.
Poi potresti farti un bel Handler nella tua applicazione dove vai a controllare quello che ti serve, per andare poi a restituire il file come stream di bytes...in questo modo decidi tu a codice cosa tornare alla richiesta.

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

zseven Profilo | Senior Member

Ciao grazie per la risposta.
L'applicazione è in .net 3.5, ed il server è nostro, lo gestisco io direttamente quindi non avrei nessun problema ad apportare modifiche.

Gli altri due casi ho visto qualcosa in rete ma non saprei precisamente come intervenire proprio a livello di codice.
Potresti essere più preciso?

Sempre se la modifica in IIS non sia più semplice...

Grazie mille

freeteo Profilo | Guru

>L'applicazione è in .net 3.5, ed il server è nostro, lo gestisco
>io direttamente quindi non avrei nessun problema ad apportare modifiche.
perfetto, hai qualche tipo di autenticazione impostata?
Casomai dai un'occhiata qui:
http://msdn.microsoft.com/en-us/library/eeyk640h(v=vs.100).aspx
http://www.codeproject.com/Articles/98950/ASP-NET-authentication-and-authorization
Con questa configurazione, se la cartella è una sottocartella (a livello url) della tua app, dovresti riuscire già avere di default il blocco alle chiamate per un utente non autenticato.


>Potresti essere più preciso?
Per quanto riguarda l'handler, è semplice:
Tasto Dx->Add new Item->Generic Handler (file .ashx)

Poi dentro lì, vai a decidere cosa ti arriva come richiesta di download, questo dipende da come crei i link sulle pagine.
Io ad esempio chiamavo tutto tramite un ID che poi mi mappava su una tabella etc...copi dentro questo codice:
<%@ WebHandler Language="C#" Class="Download" %> using System; using System.IO; using System.Linq; using System.Web; using System.Web.SessionState; public class Download : IHttpHandler, IRequiresSessionState { public bool IsReusable { get { return false; } } public void ProcessRequest(HttpContext context) { string idString = context.Request.QueryString["id"]; //--- safety code if (string.IsNullOrEmpty(idString)) return; byte[] bytes = ....leggi i bytes...; //--- hai letto uno stream di byte in memoria context.Response.ContentType = "application/octet-stream"; context.Response.AddHeader("Content-Disposition", "attachment; filename=" + nome); context.Response.AddHeader("Content-Length", bytes.Length.ToString()); context.Response.OutputStream.Write(bytes,0,bytes.Length); } }

Oppure se il file è direttamente accessibile puoi usare anche il metodo diretto, senza caricare in memoria i bytes del file:
context.Response.WriteFile(filePath);


Infine, da notare IRequiresSessionState che ti serve per poter avere accesso alla sessione corrente, quindi verificare le credenziali d'accesso...cmq il codice devi adattarlo tu, questo è solo uno spunto.



>Sempre se la modifica in IIS non sia più semplice...
oddio non me ne intendo tanto di IIS, quindi potrebbe essere semplice come cosa...solitamente uso l'autenticazione di .net, quindi vado a farmi quello che mi serve.

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo
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