AJAX

2009-12-10 13 views
6

से प्रपत्र प्रमाणीकरण और POST अनुरोध हमारे पास फॉर्म प्रमाणीकरण द्वारा संरक्षित ASP.NET ऐप है। ऐप अपनी वेब-सेवाओं को कॉल करने के लिए एमएस AJAX का भारी उपयोग करता है।AJAX

जब फॉर्म प्रमाणीकरण का समय समाप्त हो जाता है, और प्राप्त करें - अनुरोध होता है - सब ठीक है (उपयोगकर्ता को लॉगिन पृष्ठ पर रीडायरेक्ट किया जाता है)।

लेकिन जब रूपों प्रमाणीकरण का समय समाप्त और एक पोस्ट -request होता है (AJAX) - कोई रीडायरेक्ट होता है, इसके बजाय अनुप्रयोग रिटर्न "401 unathorized" और ब्राउज़र यूज़रनेम और पासवर्ड (न कि प्रवेश फार्म के लिए संकेत देता है , लेकिन एक ब्राउज़र अंतर्निहित संवाद)। निश्चित रूप से किसी भी उपयोगकर्ता नाम/पासवर्ड दर्ज करने में मदद नहीं करता है।

मैं इसे कैसे प्रबंधित करूं?

अद्यतन: फायरबग के साथ देखने के बाद, मुझे पता चला कि नियमित POST अनुरोध ठीक से लॉगिन करने के लिए रीडायरेक्ट करते हैं, यह केवल वेब-सेवा कॉल है जो "401 अनधिकृत" फेंक देती है। नियमित अनुरोध और वेब-सेवा के बीच अंतर यूआरएल है। कौन सा एक नियमित रूप से पोस्ट-अनुरोध और webservices के लिए "service.asmx/methodName" के लिए "page.aspx" ...

+1

क्या आपने फ़ायरबग के साथ देखा है जो वास्तव में सर्वर पर भेजा गया है और यह क्या प्रतिक्रिया देता है? ब्राउजर के अंतर्निर्मित प्रॉम्प्ट का आमतौर पर अर्थ है कि जिस संसाधन को आप एक्सेस करने का प्रयास कर रहे हैं वह मूल या एनटीएलएम प्रमाणीकरण द्वारा संरक्षित है। क्या आपकी साइट के कुछ हिस्सों के लिए ऐसी प्रमाणीकरण सक्षम है? –

+0

हां, आईआईएस सेटिंग्स में हमारे पास "विंडोज़ एकीकृत" प्रमाणीकरण है ("अज्ञात पहुंच" के साथ)। धन्यवाद, मैं फायरबग – Alex

उत्तर

2

ठीक है, मेरी अपनी खोज का जवाब दें।

इस मुद्दे को देख और थोड़ा अधिक शोध करने के बाद मैंने पाया कि जब एक वेब एप्लिकेशन फार्म-प्रमाणीकरण द्वारा सुरक्षित है और उपयोगकर्ता प्रमाणीकृत नहीं है, तो ऐसा होता है:

  • तो यह है एक जीईटी अनुरोध - उपयोगकर्ता लॉगिन पृष्ठ पर रीडायरेक्ट किया गया है।
  • यदि यह किसी पृष्ठ पर पोस्ट-अनुरोध है - उपयोगकर्ता लॉगिन पृष्ठ पर रीडायरेक्ट किया गया है।
  • यदि यह एक बाद अनुरोध एक वेब सेवा करने के लिए - उपयोगकर्ता 401-अनधिकृत

Thats कैसे एएसपी हो जाता है।नेट काम

और यदि वेब सेवा को AJAX (xmlHttpRequest ऑब्जेक्ट) द्वारा बुलाया जाता है और 401 देता है - निश्चित रूप से ब्राउज़र पॉप-अप लॉगिन बॉक्स दिखाता है।

अब, आपको क्या करना चाहिए Application_PostAuthenticateRequest में कुछ कोड जोड़ना जो वेब सर्विसेज के लिए 401 फेंकने से रोक देगा।

protected void Application_PostAuthenticateRequest(Object sender, EventArgs e) 
{ 
    if (Request.RequestType == "POST" //if its POST 
     && !User.Identity.IsAuthenticated //if user NOT authed 
     && !HasAnonymousAccess(Context) //if it's not the login page 
     ) 
    { 
     //lets get the auth type 
     Configuration config = WebConfigurationManager.OpenWebConfiguration("~"); 
     SystemWebSectionGroup grp = (SystemWebSectionGroup)config.GetSectionGroup("system.web"); 
     AuthenticationSection auth = grp.Authentication; 
     //if it FORMS auth 
     if(auth.Mode== AuthenticationMode.Forms) 
     { 

      //then redirect... this redirect won't work for AJAX cause xmlHttpRequest can't handle redirects, but anyway... 
      Response.Redirect(FormsAuthentication.LoginUrl, true); 
      Response.End(); 

     } 
    } 
} 
public static bool HasAnonymousAccess(HttpContext context) 
{ 
    return UrlAuthorizationModule.CheckUrlAccessForPrincipal(
     context.Request.Path, 
     new GenericPrincipal(new GenericIdentity(string.Empty), null), 
     context.Request.HttpMethod); 
} 
+0

@jazbit, क्या आप कुछ डॉक्यूमेंटेशन को इंगित कर सकते हैं जो वेब सेवाओं के लिए 401 स्टेटस कोड के बारे में बात करता है, मेरे पास एक परिदृश्य है जहां मैं सत्र पारिस्थितिकता की जांच कर रहा हूं और एक रीडायरेक्ट कर रहा हूं जिसके परिणामस्वरूप क्लाइंट –

+0

प्रतिक्रिया के लिए 401 परिणाम हैं। अंत आमतौर पर एक होता है करने के लिए बुरी चीज। आमतौर पर आप 'प्रतिक्रिया चाहते हैं। रेडियोधर्मी (यूआरएल, झूठी); HttpContext.Current.ApplicationInstance.CompleteRequest(); ' –

1

है मैं दो समाधान देखें:

(1) "दिल की धड़कन" तंत्र।

<script> 
    setInterval(ping, 60000); // based on comment by John 
    function ping() 
    { 
     $.get('/do/nothing'); 
    } 
</script> 

इस तरह सत्र के रूप में लंबे समय के रूप ब्राउज़र विंडो खुला है समाप्त नहीं करना चाहिए: प्रत्येक पृष्ठ पर एक स्क्रिप्ट है कि "पिंग" कुछ डमी ajax अनुरोध के द्वारा सर्वर, जैसे जाएगा शामिल हैं।

(2) प्रत्येक AJAX अनुरोध पर प्रतिक्रिया की स्थिति की जांच करें। अगर प्रतिक्रिया में "401 अनधिकृत" कोड है (या कोई अन्य कोड 200 से अलग है), इसका मतलब है कि सत्र समाप्त हो गया है और पृष्ठ में कुछ संवाद बॉक्स में प्रतिक्रिया लोड करने के बजाय उपयोगकर्ता को लॉगिन पृष्ठ पर रीडायरेक्ट किया गया है।

निष्कर्ष टिप्पणी के आधार पर:

सबसे अच्छा समाधान दो ऊपर तंत्र गठबंधन करने के लिए किया जाएगा। जब तक पृष्ठ ब्राउज़र में प्रदर्शित होता है तब तक हार्टबीट तंत्र सत्र को जीवंत रखने में मदद करेगा। लेकिन इसमें निश्चित रूप से गारंटी नहीं है। सत्र समाप्त होने पर सर्वर से कनेक्शन तोड़ा जा सकता है और फिर से खोला जा सकता है। तो आपको वैसे भी प्रतिक्रिया स्थिति की जांच करनी चाहिए।

+0

का प्रयास करूंगा, आप केवल 'setInterval (पिंग, 60000) कर सकते हैं;' सेट करने के लिए स्ट्रिंग को पार करना अंतराल की अनुशंसा नहीं की जाती है क्योंकि यह eval() –

+0

के समतुल्य है, आपको पिंग() में फिर से अंतराल को कॉल करने की भी आवश्यकता होगी यदि आप इसे –

+0

से अधिक बार चलाने के लिए चाहते हैं तो 200 से अधिक कोई अन्य कोड यह नहीं है कि सत्र समाप्त हो गया है। –

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