2014-08-27 14 views
5

Vì vậy, tôi đang chơi xung quanh với Owin và Katana và tôi muốn để phục vụ các tập tin tĩnh trong thư mục công cộng của tôi.Owin chỉ phục vụ tập tin trong thư mục nhất định

Tôi có một thư mục Tự tin với stylesheets và một thư mục script.

Startup của tôi:

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"), 
     }); 

    } 

Vì vậy, nếu nếu tôi duyệt đến localhost: 8861/Tôi đi theo file index.html trong thư mục công cộng của tôi. Vậy là được rồi. Nhưng tôi cũng có thể duyệt đến localhost của tôi: 8861/Content/style.css mà tôi muốn chặn. Mọi thứ mà người dùng cần có thể truy cập được trong thư mục công cộng. Tất cả các phần còn lại sẽ bị chặn.

Tôi làm cách nào để đạt được điều này?

Trả lời

1

Cấu hình của máy chủ tập tin là chính xác và không cho phép truy cập vào các thư mục khác. Tôi đã kiểm tra nó trong dự án OWIN tự lưu trữ thử nghiệm và nó hoạt động như mong đợi, chỉ có thư mục công cộng mới có thể được truy cập. Tôi giả sử rằng bạn sử dụng IIS để lưu trữ ứng dụng OWIN của bạn (vì vậy ứng dụng của bạn không tự lưu trữ). Nếu vậy, IIS Static File Handler cho phép aceess vào các tập tin và thư mục tĩnh (và vào thư mục nội dung của bạn). Vì vậy, bạn có thể tìm kiếm cách vô hiệu hóa quyền truy cập vào các tệp tĩnh trong IIS (có thể được thực hiện trong web.config) hoặc cách hạn chế quyền truy cập vào một số tệp trong số đó.

Bạn có thể loại bỏ StaticFile Handler từ cấu hình trang web, nhưng bạn nên làm điều đó một cách cẩn thận bởi vì từ thời điểm này IIS sẽ không phục vụ các tập tin tĩnh gì cả.

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

Cảm ơn điều này giải quyết vấn đề thực sự. Tuy nhiên, có vẻ như có vấn đề với việc phân phát các tệp khác trong thư mục công khai của tôi. Vì vậy, công khai có chứa một index.html, style.css và script.js. Chỉ mục được phân phối nhưng style.css và script.js đưa ra 404.4. Bất kỳ ý tưởng? – user1613512

+0

Lạ, mọi thứ hoạt động tốt trên PC của tôi, nhưng tôi thử nghiệm bằng ứng dụng tự lưu trữ. Bạn có chắc chắn rằng bạn truy cập các tệp này với các url tiếp theo yoursite/style.css chứ không phải yoursite/public/style.css? Những tệp này tồn tại trong thư mục của trang web, phải không? – ntl

+0

Một điều nữa mà bạn có thể thử. Đăng ký phần mềm trung gian tiếp theo như phần cuối cùng trong cấu hình của bạn: app.Run (context => {return context.Response.WriteAsync ("Wildcard OWIN App");}); đặt breakpoint bên trong đại biểu và cố gắng truy cập style.css từ trình duyệt. Trình xử lý này là phần mềm trung gian ký tự đại diện xử lý tất cả các yêu cầu không được xử lý bởi các phần mềm trung gian khác. Nếu ứng dụng của bạn sẽ bị dừng với điểm ngắt, OWIN xử lý yêu cầu nhưng cấu hình không đúng, nếu không có sự cố với cấu hình IIS. – ntl

2

Nếu bạn cần bare-bones tập tin xử lý, với sự kiểm soát tuyệt đối trên những file nào bạn làm, hoặc không, muốn phục vụ quý khách có thể kiểm soát hoàn chỉnh với một số trung ware. Tôi đã làm điều này vì tôi muốn phục vụ tập tin uncached trong quá trình phát triển.

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); 
      }))); 
     } 
    } 
} 

Tôi sẽ không sử dụng nó trong sản xuất, nhưng nó đã làm điều đó cho tôi.

Các vấn đề liên quan