2011-07-13 10 views
6

मेरे पास एक Global.asx फ़ाइल है जिसे कस्टम प्रमाणीकरण, ऑडिटिंग और प्रोफाइलिंग करने की आवश्यकता है। यह इसलिए आवश्यक है, क्योंकि यह एक SAML आधारित SSO सिस्टम का समर्थन करता है और सामान्य नेट प्रमाणीकरण (जो या तो SAML या मिश्रित प्रमाणीकरण का समर्थन नहीं करता)Application_BeginRequest के दौरान एक स्थिर फ़ाइल की जांच करें?

मैं इस तरह के रूप स्टैटिक फ़ाइलें, के लिए यह आग नहीं करना चाहती ओवरराइड करने के लिए की जरूरत है .js, .css, .png, आदि

कैसिनी/webdev में और IIS7 यह करता है।

जो कुछ मैं चाहता हूं वह कुछ सरल जांच है, जैसे (दुर्भाग्य से मौजूद नहीं है) स्थिर फ़ाइलों की पहचान करने के लिए।

मुझे एहसास है कि यह लिखना काफी आसान होगा, लेकिन ऐसा कुछ ऐसा लगता है जो पहले से मौजूद होना चाहिए - आईआईएस पहले ही स्थिर फाइलों के लिए कैशिंग नीति सामग्री लागू कर चुका है।

मुझे आईआईएस कॉन्फ़िगरेशन बदलने के बजाय कोड कोड की आवश्यकता है।

अद्यतन

यह मेरे वर्तमान समाधान नहीं है:

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

यह काम करता है और काफी तेज है, लेकिन बुरी तरह भद्दा लगता है। विशेष रूप से विस्तार पर निर्भर होने पर त्रुटि प्रवण होने जा रही है यदि हम नई स्थिर फाइलें नहीं सोचते हैं।

आईआईएस कॉन्फ़िगरेशन को बदले बिना कोई बेहतर तरीका है?

उत्तर

0

आप यह जांचने में सक्षम हो सकते हैं कि कौन सा हैंडलर अनुरोध से निपट रहा है।

आईआईएस 6 केवल .net फाइलों में, उदाहरण के लिए एएसपीएक्स एक हैंडलर को मैप किया जाता है जो सामान करता है।

एकीकृत पाइपलाइन के साथ आईआईएस 7 में, सबकुछ .NET के माध्यम से रूट करता है, जो आमतौर पर एक अच्छी बात है। हालांकि विभिन्न हैंडलर अभी भी विभिन्न फ़ाइल प्रकारों से निपटते हैं। विशेष रूप से मेरा मानना ​​है कि staticfilehandler वह है जिसे आप जांचना चाहते हैं। httpcontext.handler संपत्ति आपको इसे समझने की अनुमति देनी चाहिए।

आपको लगता है कि IsStatic विधि जोड़ने के लिए एक विस्तार विधि बना सकते हैं ...

साइमन

+0

मुझे एहसास है कि मैं अपना खुद का कार्यान्वयन लिख सकता हूं (जैसे कि मैं सवाल में कहता हूं) लेकिन ऐसा लगता है कि पहिया का पुन: आविष्कार करना पसंद है। आईआईएस और नेट पहले से ही जानते हैं कि यह स्थैतिक फ़ाइल अनुरोध है, इसलिए ऐसा करने का एक मौजूदा तरीका होना चाहिए। – Keith

0

कुछ विकल्प हैं:

  • उन पथों के लिए authorizationelement और इनकार कोई भी जोड़ा जा रहा है कि आप किसी भी प्रमाणीकरण की आवश्यकता नहीं है और आपकी स्थिर फाइलें
  • आप एकीकृत पाइपलाइन का उपयोग कर रहे हैं। यह अपने आईआईएस 7.
+0

मुझे एसएएमएल एसएसओ का समर्थन करने के लिए नेट की प्रमाणीकरण तंत्र को पूरी तरह से ओवरराइड करना पड़ा है (यही कारण है कि मुझे पहले स्थान पर 'Application_BeginRequest' में बहुत से काम की ज़रूरत है) तो विकल्प 1 बाहर है। साथ ही, जैसा कि मैंने प्रश्न में कहा है, आईआईएस कॉन्फ़िगरेशन को बदलना एक विकल्प नहीं है - मुझे कोड समाधान की आवश्यकता है। – Keith

+0

क्षमा करें, इसे पूरी तरह से पढ़ना चाहिए था। अपडेट करूंगी। – Aliostad

0

इसमें कोई शक नहीं है कि आप क्योंकि ASP.NET मार्ग इंजन तय करने के लिए एक फ़ाइल मौजूद इस कोड का उपयोग करता है एक कस्टम विस्तार विधि बनाने की जरूरत नहीं है पर बंद कर दें,

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

आप यह तय करने में सक्षम नहीं होंगे कि अनुरोध का उपयोग कर एप्लिकेशन_BeginRequest में अनुरोध स्थैतिक है या नहीं।हैंडलर क्योंकि रूटिंग मॉड्यूल हैंडलर बदल सकता है और यह मॉड्यूल हमेशा Application_BeginRequest के बाद निष्पादित करता है। मेरा सुझाव है कि उसी कोड का उपयोग करना जो एएसपी.NEt रूटिंग इंजन का उपयोग करता है।

संबंधित मुद्दे