173 messaggi dal 16 giugno 2001
Ciao,
sono un po indietro ancora con il net e mi trovo nella condizione di settare il mio iis7 per impedire di visualizzare senza essere loggati dei documenti .pdf che vengono creati dalla mia applicazione e inseriti in una cartella "doc" all'interno della root del sito ma nonostante ho letto un po di documentazione ho le idee un po confuse.

L'applicazione in questo momento funziona solo che ha il problema che se scrivo lp url completo del file .pdf questo viene visualizzato.

Per prima cosa non ho capito se avendo un iis7 posso agire solo su di esso ( modalita pipeline integrata ) oppure devo andare anche a toccare il web.config e aggiungere un handler?

Fino a questo momento non mi era ancora successo di bloccare un file statico da area riservata.


In un altro semplice lavoro avevo provato la form autentication (senza file da bloccare ) con i nomi degli utenti scritti dentro il webconfig ma ora ho un db sqlserver con un controllo utenti tramite dataset come faccio a scrivere i nomi dentro la form autentication??
Infatti se abilito la forms autentication non ho più accesso anche con credenziali valide alle aree riservate



Attualmente ho modificato il web config nel modo sotto ma non ho nessun vantaggio.
Qualche dritta per favore
Grazie

Ciao

------------------------------
<location path="doc">
<system.web>

<authentication mode="Forms" >
<forms loginUrl="login.aspx" name=".ASPNETAUTH" >
</forms>
</authentication>

<authorization>
<deny users ="?" />
</authorization>
</system.web>
</location>
------------------------
Ho anche aggiunto le seguenti righe

<system.webServer>
<modules>


<add name="FormsAuthenticationModule" type="System.Web.Security.FormsAuthenticationModule" />
<remove name="UrlAuthorization" />
<add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" />
<remove name="DefaultAuthentication" />
<add name="DefaultAuthentication" type="System.Web.Security.DefaultAuthenticationModule" />
</modules>
</system.webServer>
-----------------------------
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao

alex71 ha scritto:

Per prima cosa non ho capito se avendo un iis7 posso agire solo su di esso ( modalita pipeline integrata ) oppure devo andare anche a toccare il web.config

Usare la console di IIS7 o modificare il web.config è la stessa cosa, perché ogni settaggio fatto dalla console viene salvato sul web.config (e viceversa).

alex71 ha scritto:

Attualmente ho modificato il web config nel modo sotto ma non ho nessun vantaggio.

Quello che hai fatto è quasi giusto, manca un pezzetto.
Devi dire ad IIS di inoltrare al runtime di asp.net anche le richieste a file statici, che normalmente verrebbero gestiti dallo StaticFileHandler.
Questo lo fai impostando <modules runAllManagedModulesForAllRequests="true"

<location path="doc">
  <system.web>
    <authorization>
      <deny users ="?" />
    </authorization>
   </system.web>
</location>

<system.web>
  <authentication mode="Forms" >
    <forms loginUrl="login.aspx" name=".ASPNETAUTH"></forms>
  </authentication>
</system.web>

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
  </modules>
</system.webServer>

Ora i tuoi file .pdf dovrebbero essere protetti, anche se questa soluzione non è proprio quella ideale.
Dato che che runAllManagedModulesForAllRequests è impostato su true, il runtime di asp.net verrà tirato in ballo per ogni richiesta a file statico, comprese foto .jpg, stili .css e file javascript.

L'alternativa è quella di ricominciare da capo e scrivere un HttpHandler da legare all'estensione .pdf. In questo modo saranno solo le richieste a quel tipo di file ad essere elaborate dal runtime di asp.net.
<system.webServer>
  <handlers>
    <add name="HandlerPdf" type="TuoNamespace.TuoHttpHandler" path="doc/*.pdf" verb="*" />
  </handlers>
</system.webServer>

Nel codice dell'handler avrai l'opportunità di controllare se l'utente è anomino o autenticato. Nel primo caso lo reindirizzerai alla pagina di Login, oppure gli mostrerai un errore HTTP 403 Forbidden.
Nel secondo caso, se era autenticato, andrai a leggere il file .pdf dal disco e lo invierai al client con il metodo Response.TransmitFile.

Ti consiglio di scrivere un HttpHandler asincrono, perché la sua esecuzione può durare molto, trattandosi del download di un file.
http://www.aspitalia.com/script/897/Costruire-HttpHandler-Asincroni-ASP.NET-2.0.aspx
Un HttpHandler asincrono va in esecuzione in un thread fuori dal thread pool di Asp.Net e perciò non contribuirà al raggiungimento del numero massimo di thread consentiti.

Scrivere un handler asincrono è più semplice in asp.net 4.5 grazie alle nuove parole chiave async e await, ecco un articolo di Marco De Sanctis che ne parla.
http://www.aspitalia.com/script/1095/Utilizzo-Metodi-Asincroni-HttpHandler-ASP.NET-4.5.aspx


ciao
Modificato da BrightSoul il 14 dicembre 2012 22.29 -

Enjoy learning and just keep making
173 messaggi dal 16 giugno 2001
Ciao grazie della risposta ho potuto leggerla solo ieri sera.
Sei sempre molto completo e preciso nelle indicazioni.

Bene alla fine ho seguito il tuo consiglio e mi sono scritto con l'aiuto di qualche guida un handler ma non sincrono, a proposito immagino che sfruttare le funzionalita del 4,5 significa anche aggiornare il framework del server vero ??



Tieni presente che sono file .pdf da 25k quindi credo che posssa andar bene anche cosi

Ora lo provo nel caso ti disturbo ancora
Grazie

Ciao
11.886 messaggi dal 09 febbraio 2002
Contributi


alex71 ha scritto:

immagino che sfruttare le funzionalita del 4,5 significa anche aggiornare il framework del server vero

Sì, è un aggiornamento "sul posto" del framework 4. Sebbene la versione 4.5 sia molto compatibile con la precedente, è meglio non installarlo alla cieca su un server di produzione. Documentati sul possibile impatto che potrebbe avere.
http://msdn.microsoft.com/it-it/library/hh367887%28v=vs.110%29.aspx

Il framework 4.5 non è necessario per scrivere httphandler asincroni e comunque, come hai sottolineato tu stesso, i file pdf pesano molto poco quindi un httphandler "normale" va benissimo.

ciao!

Enjoy learning and just keep making
354 messaggi dal 13 marzo 2013
Ciao a tutti, scusate se mi intrometto ma anche io ho lo stesso problema, dovrei proteggere il download dei file all'interno della mia area riservata.
Leggendo questo topic, in aggiunta con questo
http://forum.aspitalia.com/forum/post/358052/Impedire-Accesso-Diretto-File.aspx?PageIndex=1

ho scritto il seguente handler

Namespace handler_mio

    Public Class Handler_download
        Implements IHttpHandler

#Region "IHttpHandler Members"

        Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
            Get
                Return True
            End Get
        End Property

        Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest

            Dim response As HttpResponse = context.Response
            Dim request As HttpRequest = context.Request

            'se l'utente non è autenticato rimando al login
            If Not request.IsAuthenticated Then
                response.StatusCode = 401
                response.End()
            End If

            'il contenuto arriva al browser
            response.Clear()
            response.ContentType = "application/x-zip-compressed"
            response.WriteFile(request.Path)
        End Sub

#End Region

    End Class


End Namespace


e successivamente nel web.config aggiunto queste righe
<system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <handlers>
      <add name="HandlerDownload" type="handler_mio.Handler_download" path="doc/*.pdf" verb="*"/>
    </handlers>
  </system.webServer>

il problema è che cliccando sul link che mi indirizza al nome del file il tutto procede come se niente fosse.
Modificato da PR17 il 10 maggio 2013 18.36 -
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
la prima questione da chiarire è se il tuo handler sta andando in esecuzione o meno. Metti un breakpoint sulla prima istruzione di ProcessRequest e poi lancia il debug in locale.
Adesso, dal browser, prova ad accedere ad uno dei file che dovrebbero essere protetti dall'HttpHandler: l'esecuzione si interrompe correttamente sul breakpoint oppure non succede nulla?
Quando pubblichi l'applicazione nel server hai lo stesso comportamento?

Se il tuo HttpHandler non va in esecuzione, uno dei motivi potrebbe essere che il tuo sito web gira in un'application pool in modalità classica (verificalo dalla console di IIS).
Solo in questo caso, l'handler va registrato nel nodo system.web/httpHandlers del web.config. Inoltre mi sembra che sia necessario un'intervento dalla console di IIS per fare in modo che le richieste ai file statici siano passate anch'esse al runtime di ASP.NET.

L'altro motivo potrebbe essere una path errata. Ad esempio vedo che restituisci un content type di "application/x-zip-compressed", ma poi nel web.config la path punta a file pdf.
Nel frattempo prova questo: crea un altro web.config all'interno della cartella che contiene i file statici che vuoi proteggere (es. dentro /doc). Adesso registra l'handler lì dentro e come path metti semplicemente path="*.pdf" oppure path="*.zip", a seconda che tu voglia proteggere pdf o zip.


Ultima cosa che però non c'entra col problema: al posto di response.WriteFile è preferibile usare response.TransmitFile perché il file non deve essere caricato in memoria, prima del suo trasferimento. Qui trovi un articolo.
http://www.aspitalia.com/script/944/Inviare-File-Grandi-Dimensioni-HttpHandler-ASP.NET.aspx

ciao
Modificato da BrightSoul il 12 maggio 2013 16.43 -

Enjoy learning and just keep making
354 messaggi dal 13 marzo 2013
BrightSoul ha scritto:
ciao,
la prima questione da chiarire è se il tuo handler sta andando in esecuzione o meno. Metti un breakpoint sulla prima istruzione di ProcessRequest e poi lancia il debug in locale.
Adesso, dal browser, prova ad accedere ad uno dei file che dovrebbero essere protetti dall'HttpHandler: l'esecuzione si interrompe correttamente sul breakpoint oppure non succede nulla?
Quando pubblichi l'applicazione nel server hai lo stesso comportamento?

Ciao, chiedo scusa mi sono spiegato male io probabilmente.
Il mio handler non va in esecuzione, perché ho messo il breakpoint alla prima istruzione e lanciando il debug non si ferma. Ovviamente non ho pubblicato il il progetto sul server perché non funzionando nemmeno in locale vorrei prima risolvere il problema.


Se il tuo HttpHandler non va in esecuzione, uno dei motivi potrebbe essere che il tuo sito web gira in un'application pool in modalità classica (verificalo dalla console di IIS).
Solo in questo caso, l'handler va registrato nel nodo system.web/httpHandlers del web.config. Inoltre mi sembra che sia necessario un'intervento dalla console di IIS per fare in modo che le richieste ai file statici siano passate anch'esse al runtime di ASP.NET.

sono un po' ignorante in fatto di handler purtroppo cosa devo fare?
ma questo intervento va fatto anche in debug?


L'altro motivo potrebbe essere una path errata. Ad esempio vedo che restituisci un content type di "application/x-zip-compressed", ma poi nel web.config la path punta a file pdf.
Nel frattempo prova questo: crea un altro web.config all'interno della cartella che contiene i file statici che vuoi proteggere (es. dentro /doc). Adesso registra l'handler lì dentro e come path metti semplicemente path="*.pdf" oppure path="*.zip", a seconda che tu voglia proteggere pdf o zip.

Per quanto riguarda la path mi sono accorto pure io, ma non entrando nemmeno nell'handler credo che per ora il problema sia altrove.


Ultima cosa che però non c'entra col problema: al posto di response.WriteFile è preferibile usare response.TransmitFile perché il file non deve essere caricato in memoria, prima del suo trasferimento. Qui trovi un articolo.
http://www.aspitalia.com/script/944/Inviare-File-Grandi-Dimensioni-HttpHandler-ASP.NET.aspx

Intanto leggo questo e sistemo questa parte, in attesa di altre delucidazioni (se riesci, se no grazie per quello che hai già fatto)
Modificato da PR17 il 13 maggio 2013 09.41 -
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
ok, dunque il problema è che l'handler non va in esecuzione.

PR17 ha scritto:

ma questo intervento va fatto anche in debug?

In genere no perché in debug, di solito, si usa il webserver di sviluppo di Visual Studio. Se è questo il tuo caso, devi solo assicurarti che il tuo sito stia andando in esecuzione in modalità integrata.
Guarda questa immagine, raffigura il riquadro delle proprietà del progetto. La voce "Managed pipeline mode" deve essere su "Integrated".
Se non lo era, forse hai trovato il problema.

PR17 ha scritto:

Per quanto riguarda la path mi sono accorto pure io, ma non entrando nemmeno nell'handler credo che per ora il problema sia altrove.

No, il problema potrebbe essere proprio la path. Se l'url che tu richiedi dal browser non trova corrispondenza nella path dell'handler, allora non verrà eseguito.
Un HttpHandler, a differenza di un HttpModule, non va in esecuzione per ogni richiesta web.

Cerca di fare dei test con path diverse. In particolare, per il momento togli doc/ e lascia semplicemente *.pdf (o *.zip). Prova così:
<system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <handlers>
      <add name="HandlerDownload" type="handler_mio.Handler_download" path="*.pdf" verb="*"/>
    </handlers>
</system.webServer>


ciao
Modificato da BrightSoul il 13 maggio 2013 23.50 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.