2011-07-13 23 views
6

Tôi có tệp Global.asx cần thực hiện các công cụ xác thực, kiểm tra và định cấu hình tùy chỉnh. Điều này là cần thiết vì nó hỗ trợ hệ thống SSO dựa trên SAML và cần ghi đè xác thực thông thường .Net (không hỗ trợ SAML hoặc xác thực hỗn hợp)Kiểm tra tệp tĩnh trong Application_BeginRequest?

Tôi không muốn kích hoạt tệp tĩnh cho các tệp tĩnh, chẳng hạn như .js, .css, .png, v.v.

Trong Cassini/WebDev và IIS7 thì có.

Điều tôi muốn có là một số kiểm tra đơn giản, chẳng hạn như (không tồn tại, không may) để xác định các tệp tĩnh.

Tôi nhận ra rằng điều này sẽ khá đơn giản để viết, nhưng nó cảm thấy giống như một cái gì đó mà phải đã tồn tại - IIS đã áp dụng bộ đệm chính sách công cụ cho các tập tin tĩnh và như vậy.

Tôi cần một giải pháp mã, thay vì cấu hình IIS thay đổi một.

Cập nhật

Đây là cách giải quyết hiện tại của tôi:

/// <summary>Hold all the extensions we treat as static</summary> 
static HashSet<string> allowedExtensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase) 
{ 
    ".js", ".css", ".png", ... 
}; 

/// <summary>Is this a request for a static file?</summary> 
/// <param name="request">The HTTP request instance to extend.</param> 
/// <returns>True if the request is for a static file on disk, false otherwise.</returns> 
public static bool IsStaticFile(this HttpRequest request) 
{ 
    string fileOnDisk = request.PhysicalPath; 
    if (string.IsNullOrEmpty(fileOnDisk)) 
    { 
     return false; 
    } 

    string extension = Path.GetExtension(fileOnDisk); 

    return allowedExtensions.Contains(extension); 
} 

này hoạt động và đủ nhanh, nhưng cảm thấy khủng khiếp clunky. Đặc biệt dựa vào các phần mở rộng sẽ dễ bị lỗi nếu chúng ta thêm các tệp tĩnh mới không được nghĩ tới.

Có cách nào tốt hơn mà không thay đổi cấu hình IIS không?

Trả lời

0

Bạn có thể kiểm tra trình xử lý nào đang xử lý yêu cầu.

Chỉ trong IIS6 tệp .net, ví dụ: aspx được ánh xạ tới trình xử lý thực hiện công cụ.

Trong IIS7 với đường ống tích hợp, mọi thứ đều đi qua .net, thường là điều tốt. Tuy nhiên, các trình xử lý khác nhau vẫn xử lý các loại tệp khác nhau. Đặc biệt tôi tin rằng staticfilehandler là thứ bạn cần kiểm tra. Thuộc tính httpcontext.handler sẽ cho phép bạn tìm ra.

Bạn có thể tạo ra một phương pháp mở rộng thêm rằng phương pháp IsStatic ...

Simon

+0

Tôi nhận ra rằng tôi có thể viết thực hiện của riêng mình (như tôi nói trong câu hỏi) nhưng cảm giác như tái phát minh ra bánh xe. IIS và .Net đã biết rằng đây là yêu cầu tệp tĩnh nên có một cách để thực hiện điều này. – Keith

0

Có một vài lựa chọn:

  • Thêm authorizationelement và từ chối không cho những đường dẫn mà bạn không cần bất kỳ xác thực nào và chứa các tệp tĩnh của bạn
  • Bạn đang sử dụng đường ống tích hợp. Tắt nó đi trên IIS của bạn 7.
+0

Tôi đã hoàn toàn ghi đè cơ chế cấp phép của .Net để hỗ trợ SAML SSO (đó là lý do tại sao tôi cần rất nhiều công việc trong 'Application_BeginRequest' ở vị trí đầu tiên) vì vậy hãy chọn tùy chọn 1. Ngoài ra, như tôi đã nói trong câu hỏi, việc thay đổi cấu hình IIS không phải là một tùy chọn - tôi cần một giải pháp mã. – Keith

+0

Xin lỗi, bạn nên đọc nó đầy đủ. Sẽ nâng cấp. – Aliostad

0

Không có nghi ngờ rằng bạn cần phải tạo ra một phương pháp mở rộng thông thường vì cơ ASP.NET định tuyến sử dụng mã này để quyết định xem một tập tin tồn tại,

if (!this.RouteExistingFiles) 
{ 
    string appRelativeCurrentExecutionFilePath = httpContext.Request.AppRelativeCurrentExecutionFilePath; 
    if (((appRelativeCurrentExecutionFilePath != "~/") && (this._vpp != null)) && (this._vpp.FileExists(appRelativeCurrentExecutionFilePath) || this._vpp.DirectoryExists(appRelativeCurrentExecutionFilePath))) 
    { 
      return null; 
     } 
} 

Bạn sẽ không thể quyết định xem yêu cầu có tĩnh trong Application_BeginRequest khi sử dụng ngữ cảnh hay không.handler vì Routing Module có thể thay đổi handler và module này luôn thực hiện sau khi Application_BeginRequest. Đề xuất của tôi là sử dụng mã tương tự mà công cụ định tuyến ASP.NEt sử dụng.

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