2014-08-27 27 views
5

Quindi sto giocando con Owin e Katana e voglio pubblicare file statici nella mia cartella pubblica.Owin serve solo file in alcune cartelle

Ho una cartella Contenuto con fogli di stile e una cartella di script.

mio Startup:

public void Configuration(IAppBuilder app) 
    { 
#if DEBUG 
     //when things go south 
     app.UseErrorPage(); 
    #endif 

     // Remap '/' to '.\public\'. 
     // Turns on static files and public files. 
     app.UseFileServer(new FileServerOptions() 
     { 
      RequestPath = PathString.Empty, 
      FileSystem = new PhysicalFileSystem(@".\public"), 
     }); 

    } 

Quindi, se se navigo a localhost: 8861/I go il file index.html nella mia cartella pubblica. Va bene. Ma posso anche navigare sul mio localhost: 8861/Content/style.css che voglio bloccare. Tutto ciò di cui l'utente ha bisogno dovrebbe essere accessibile nella cartella pubblica. Tutto il resto dovrebbe essere bloccato.

Come posso ottenere questo risultato?

risposta

1

La configurazione del file server è corretta e non consente l'accesso ad altre cartelle. L'ho verificato all'interno del progetto self-host OWIN di test e funziona come previsto, è possibile accedere solo alla cartella pubblica. Presumo che tu usi IIS per ospitare la tua applicazione OWIN (quindi la tua app non è auto-ospitata). In tal caso, IIS Static File Handler consente l'accesso a file e directory statici (e alla cartella del contenuto). Quindi puoi cercare come disabilitare l'accesso ai file statici in IIS (può essere fatto in web.config) o come limitare l'accesso ad alcuni di essi.

È possibile rimuovere StaticFile Handler dalla configurazione del sito Web, ma è necessario farlo con attenzione perché da questo momento IIS non servirà affatto file statici.

<configuration> 
    <system.webServer> 
     <handlers> 
      <remove name="StaticFile" /> 
     </handlers> 
    </system.webServer> 
</configuration> 
+0

Grazie a ciò risolve il problema. Tuttavia sembra esserci un problema nel servire gli altri file nella mia cartella pubblica. Quindi public contiene un index.html, style.css e script.js. L'indice viene pubblicato ma style.css e script.js danno un 404.4. Qualche idea? – user1613512

+0

Strano, tutto funziona perfettamente sul mio PC, ma ho provato con l'app ospitata in proprio. Sei sicuro di accedere a questi file con i seguenti URL yoursite/style.css e non yoursite/public/style.css? Questi file esistono nella cartella del sito Web, giusto? – ntl

+0

Un'altra cosa che puoi provare. Registra il prossimo middleware come l'ultimo nella configurazione di te: app.Run (context => {return context.Response.WriteAsync ("Wildcard OWIN App");}); posiziona il punto di interruzione all'interno del delegato e prova ad accedere a style.css dal browser. Questo gestore è un middleware jolly che gestisce tutte le richieste che non sono state gestite da altri middleware. Se la tua app verrà arrestata con il punto di interruzione, OWIN gestisce la richiesta ma la configurazione non è corretta, altrimenti qualcosa non funziona con la configurazione di IIS. – ntl

2

Se avete bisogno scarno gestione dei file, con il controllo assoluto su quali file si fa, o non fare, vuole servire si può assumere il controllo completo con un po 'middle-ware. L'ho fatto perché volevo un servizio file non collegato durante lo sviluppo.

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Threading.Tasks; 
using System.Web; 

namespace Owin 
{ 
    using AppFunc = Func<IDictionary<string, object>, Task>; 

    public static class DynamicFileExtension 
    {  
     /// <summary> 
     /// ONLY use during development 
     /// </summary> 
     public static void UseDynamicFiles(this IAppBuilder app, string baseDirectory) 
     { 
      app.Use(new Func<AppFunc, AppFunc>(next => (async context => 
      { 
       var method = (string) context["owin.RequestMethod"]; 
       var requestpath = (string) context["owin.RequestPath"]; 
       var scheme = (string) context["owin.RequestScheme"]; 
       var response = (Stream) context["owin.ResponseBody"]; 
       var responseHeader = (Dictionary<string, string[]>) context["owin.ResponseHeaders"]; 

       if (method == "GET" && scheme == "http") 
       { 
        var fullpath = baseDirectory + requestpath; 

        // block logic...  

        if (File.Exists(fullpath)) 
        { 

         using (var file = File.OpenRead(fullpath)) 
         { 
          await file.CopyToAsync(response); 
         } 

         var mime = MimeMapping.GetMimeMapping(fullpath); 

         responseHeader.Add("Content-Type", new[] {mime}); 

         return; 
        } 
       } 

       await next.Invoke(context); 
      }))); 
     } 
    } 
} 

io non lo uso in produzione, ma ha fatto il trucco per me.