2010-08-02 4 views
6

तो, मैं तो जैसे web.configs के साथ वेब क्षुधा है:निर्धारित करें कि वर्तमान पृष्ठ को प्राधिकरण की आवश्यकता है या नहीं?

<authorization> 
    <deny users="?"/> 
</authorization> 
... 
<location path="SomeUnsecuredPage.aspx"> 
    <system.web> 
    <authorization> 
     <allow users="*"/> 
    </authorization> 
    </system.web> 
</location> 

दूसरे शब्दों में, अधिकांश पृष्ठों प्रमाणीकरण और प्राधिकरण की आवश्यकता होती है, लेकिन कुछ नहीं है।

तब मेरे पास एक IHttpModule है जिसका उपयोग सभी विभिन्न अनुप्रयोगों द्वारा किया जाएगा। मैं बस इतना करना चाहता हूं कि वर्तमान अनुरोध "सुरक्षित" है या नहीं। अगर पृष्ठ को प्राधिकरण की आवश्यकता नहीं है, तो मैं नहीं चाहता कि मेरा IHttpModule कुछ भी करे। मैं फॉर्म प्रमाणीकरण का उपयोग कर रहा हूं और मुझे लगता है कि फॉर्म प्रमाणीकरण में पहले से ही यह सारी जानकारी कैश की गई है, है ना? इसके अलावा, चूंकि यह चेक लगातार चल रहा है इसलिए इसे बहुत तेज़ होना चाहिए।

मैं वर्तमान में HttpAplication.AuthorizeRequest की सदस्यता ले रहा हूं, लेकिन आश्चर्य की बात यह है कि यह ईवेंट उन संसाधनों के लिए भी आग लगती है जो अज्ञात पहुंच की अनुमति देते हैं।

कोई विचार? पढ़ने के लिए धन्यवाद!

उत्तर

4

एक bootleg आईपीरिनियल बनाएँ और फिर आपको इसका उपयोग करना होगा। यदि bootleg प्रिंसिपल के पास पहुंच है तो अनाम पहुंच की अनुमति है।

var method = typeof(UrlAuthorizationModule).GetMethod("RequestRequiresAuthorization", BindingFlags.NonPublic | BindingFlags.Static); 
var requiresAuthentication = (Boolean)method.Invoke(null, new object[] { HttpContext.Current }); 

इस उपयोग करने से पहले, यह सुनिश्चित करें कि अपने वेब साइट प्रतिबिंब प्रदर्शन करने के लिए अनुमति की हो:

public static class AnonymousAccessCheck 
      { 
       public static bool IsAnonymousAccessAllowed(HttpRequest request) 
       { 
        // unfortunately checking if a page allows anonymous access is more complicated than you'd think(I think). 
        // here we have to create a "Fake" IPrincipal that will only ever have access to 
        // pages that allow anonymous access. That way if our fake principal has access, 
        // then anonymous access is allowed 

        UrlAuthorizationModule urlAuthorizationModule = new UrlAuthorizationModule(); 
        return UrlAuthorizationModule.CheckUrlAccessForPrincipal(request.Path, AnonymousPrincipal.Instance, request.RequestType); 
       } 

       private class AnonymousPrincipal : IPrincipal 
       { 
        private static AnonymousPrincipal _Instance; 
        public static AnonymousPrincipal Instance 
        { 
         get 
         { 
          if (_Instance == null) 
           _Instance = new AnonymousPrincipal(); 

          return _Instance; 
         } 
        } 

        private AnonymousPrincipal() 
        { 
         _Identity = new AnonymousIdentity(); 
        } 

        private readonly IIdentity _Identity; 

        #region IPrincipal Members 

        public IIdentity Identity 
        { 
         get { return _Identity; } 
        } 

        public bool IsInRole(string role) 
        { 
         return false; 
        } 

        #endregion 

        private class AnonymousIdentity : IIdentity 
        { 
         #region IIdentity Members 
         public string AuthenticationType 
         { 
          get { return string.Empty; } 
         } 

         public bool IsAuthenticated 
         { 
          get { return false; } 
         } 

         public string Name 
         { 
          get { return string.Empty; } 
         } 
         #endregion 
        } 
       } 
      } 
+0

+1 को वोट दें। कोड का बहुत उपयोगी टुकड़ा। हालांकि, इसे 'UrlAuthorizationModule' का उदाहरण बनाने की आवश्यकता नहीं है। बस स्थिर विधि 'CheckUrlAccessForPrincipal' का उपयोग करना पर्याप्त है। –

0

मुझे लगता है कि अगर सर्वर 401 अनधिकृत स्थिति कोड के साथ प्रतिक्रिया देता है, तो संसाधन को प्राधिकरण की आवश्यकता हो सकती है। लेकिन कभी-कभी सर्वर लॉगिन पेज पर रीडायरेक्ट कर सकता है, इसलिए यह विधि बहुत विश्वसनीय नहीं है।

0

derp!

HttpContext.Current.SkipAuthorization 
+0

असल में, कभी नहीं। यह web.config में सेट मेरे प्रमाणीकरण बहिष्करण के लिए हमेशा झूठा है। केवल login.aspx और WebResource.axd जैसे पृष्ठ इस संपत्ति को सत्य पर सेट करते हैं। सिंगलटन आईपीरियल प्रिंसिपल इंस्टेंस बनाने के लिए मेरे उत्तर –

0

एक और अधिक प्रत्यक्ष दृष्टिकोण पीछा कर रहा है।

< शेख़ी>

मैं समझ गया कभी नहीं किया है क्यों माइक्रोसॉफ्ट छिपाने के उपयोग करते हुए अपने एपीआई के इतना "आंतरिक" (इस विधि की तरह)। मेरी राय में, अगर माइक्रोसॉफ्ट को आंतरिक रूप से कुछ खुलासा करना पड़ा तो संभावना है कि किसी को भी इसकी आवश्यकता होगी।

</शेख़ी>

7

बजाय एक अवैध प्रिंसिपल/पहचान बनाने की तुम सिर्फ एक सामान्य पहचान का उपयोग कर सकते हैं।

public bool IsAnonymousAccessAllowed() 
{ 
    return UrlAuthorizationModule.CheckUrlAccessForPrincipal(Request.Path, new GenericPrincipal(new GenericIdentity(""), new string[0]), Request.RequestType); 
} 
संबंधित मुद्दे