2015-08-17 21 views
25

मैं एक ASP.NET MVC/वेब एपीआई बैकएंड जहां मैं अपने Phonegap अनुप्रयोग के लिए एक फार्म प्रमाणीकरण को लागू किया है है फॉर्म्स। लॉगिन इस तरह jQuery अजाक्स कॉल के माध्यम से उन क्रेडेंशियल्स भेजकर निष्पादित होनेमुद्दे Phonegap (Android) पर प्रमाणीकरण

$.ajax({ 
    type: "POST", 
    url: "/api/authentication/login", 
    data: JSON.stringify({ Username: username, Password: password }), 
    contentType: "application/json; charset=utf-8", 
    dataType: "TEXT", 
    statusCode: { 
     200: function (response, status, xhr) { 
      // successfully authenticated 
      Backbone.history.navigate("/", { trigger: true }); 
     } 
    } 
}); 

बैकेंड के लिए लॉग इन विधि इस प्रकार है:

[ActionName("login")] 
[AllowAnonymous] 
public LoginResult Login(LoginCredentials credentials) 
{ 
    // doing all kinds of things here 

    // if valid credentials 
    FormsAuthentication.SetAuthCookie(loginID, true); 
    return loginResult; 
} 

मैं अपने Web.config में यह है:

<authentication mode="Forms"> 
    <forms 
    name=".ASPXAUTH" 
    loginUrl="/login" 
    defaultUrl="/home" 
    protection="All" 
    slidingExpiration="true" 
    timeout="525600" 
    cookieless="UseCookies" 
    enableCrossAppRedirects="false" 
    requireSSL="true" 
    > 
    </forms> 
</authentication> 

अब Android के साथ समस्या यह है कि यहाँ कुकी को ठीक ढंग सेट कर दिया जाता है और यह प्रवेश के बाद मेरी अधिकृत तरीकों पर काम करता है, लेकिन कभी कभी (अक्सर) जब मैं अनुप्रयोग को बंद करने और इसे फिर से खोलने के लिए, मुझे पता नहीं मैं कर रहा हूँ लॉग इन लॉग इन। कुकी अब और नहीं है, मैं इसे अनुरोध में नहीं देख सकता। ऐसा नहीं होना चाहिए क्योंकि मैंने टाइमआउट को 525600 पर सेट किया है। मैंने देखा है कि यह समस्या तब होती है जब मैं लॉगिन के तुरंत बाद ऐप बंद करता हूं। दूसरी तरफ अगर मैं लॉग आउट करता हूं और फिर ऐप बंद किए बिना लॉग इन करता हूं, तो कुकी ठीक से सहेजी जाती है।

लेकिन, अगर मैं रहना कुकी मिलता है, समय की सबसे लॉगआउट अजीब रूप में अच्छी तरह व्यवहार करता है। इस तरह मैं लॉगआउट अनुरोध करते हैं:

$.ajax({ 
    type: "POST", 
    url: "/api/authentication/logout", 
    data: "{}", 
    contentType: "application/json; charset=utf-8", 
    dataType: "text" 
    success: function (response) { 
     // successfully logged out 
     Backbone.history.navigate("api/login", { trigger: true }); 
    } 
}); 

बैकएंड:

[ActionName("logout")] 
[AllowAnonymous] 
public String Logout() 
{ 
    FormsAuthentication.SignOut(); 

    HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, ""); 
    cookie.Expires = DateTime.Now.AddYears(-1); 
    HttpContext.Current.Response.Cookies.Add(cookie); 

    return "home"; 
} 

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

मैं चाल के सभी प्रकार की कोशिश की है, जैसे: लॉगआउट/लॉगिन अनुरोध को क्रियान्वित लॉगिन/लॉगआउट (location.reload())

  • के बाद

    • अतिरिक्त पुनः लोड कई बार
    • के बाद अन्य पद्धतियों की अनुरोध निष्पादित लॉगिन/लॉगआउट
    • लॉगिन/लॉगआउट अनुरोध के बीच 1-10 सेकंड टाइमआउट और
    • उपरोक्त
    • के सभी प्रकार के विविधताएं के रूप में iOS और Windows Phone पर इरादा

    प्रमाणीकरण काम करता है। समस्या केवल एंड्रॉइड पर होती है (किटकैट और लॉलीपॉप पर परीक्षण)। एंड्रॉइड एमुलेटर पर कोई समस्या नहीं है, लेकिन वास्तविक उपकरणों और विजुअल स्टूडियो एंड्रॉइड एमुलेटर पर यह हर समय होता है।

    मैं किस दिशा में यहां से जाने के लिए पता नहीं है। क्या एंड्रॉइड वेबव्यू में कुछ ऐसा है जो इस तरह के व्यवहार का कारण बन सकता है? क्या मैं कुछ और परीक्षण कर सकता हूं? कृपया सहायता कीजिए!

    मैं और अधिक जानकारी देने के लिए यदि आवश्यक हो तो बहुत खुशी हूँ।

    संपादित करें: फैबियन की टिप्पणी से प्रेरित होकर, मैं लॉगआउट विधि इस के लिए बदल दिया:

    FormsAuthentication.SignOut(); 
    
    HttpCookie cookie = HttpContext.Current.Response.Cookies[FormsAuthentication.FormsCookieName]; 
    cookie.Expires = DateTime.Now.AddYears(-1); 
    HttpContext.Current.Response.Cookies.Clear(); 
    HttpContext.Current.Response.Cookies.Add(cookie); 
    
    return "home"; 
    

    बजाय एक नई कुकी बनाने के बजाय, मैं जवाब में एक प्रयोग किया जाता है। काम नहीं किया।

    मैंने यहां से कुछ भी कोशिश की जो मैंने यहां पाया: http://techblog.dorogin.com/2013/01/formsauthentication-gotcha-with-signout.html इससे कोई फर्क नहीं पड़ता, पथ समस्या नहीं थी। अभी भी एक समाधान की तलाश है।

    किसी अन्य संस्करण: अभी भी इसके लिए समाधान नहीं ढूंढ पा रहा है। मुझे एक भयानक कामकाज करना पड़ा।

    • लॉगिन: मैं लॉगिन और फिर एक डमी विधि के लिए एक अनुरोध के बाद दो पुनः लोड कर सकते हैं। यह हर बार काम करता प्रतीत होता है।
    • लॉगआउट: मैं स्थानीय स्टोरेज में रखे गए ध्वज का उपयोग यह निर्धारित करने के लिए करता हूं कि उपयोगकर्ता ने लॉग आउट किया है और स्टार्टअप में लॉगआउट निष्पादित किया है। यह हमेशा कुकी को सही ढंग से हटा देता है।

    मैं इन हैक्स से खुश नहीं हूं और मैं अब भी एक बेहतर समाधान की उम्मीद कर रहा हूं।

  • +0

    में कस्टम हेडर के माध्यम से भेजा गया था मुझे लगता है कि आप अधिक जानकारी के लिए अपने Android कोड पोस्ट करना चाहिए। – BNK

    +0

    "एंड्रॉइड कोड" से आपका क्या मतलब है? मैं एक फोनगैप एप्लिकेशन के बारे में बात कर रहा हूं और सभी संबंधित जेएस कोड प्रश्न में हैं। – balzafin

    +0

    मेरा मतलब है कि आप अपना वेबव्यू – BNK

    उत्तर

    1

    फ़ोनगैप file:// प्रोटोकॉल से फ़ाइलों को लोड करता है। दुर्भाग्यवश, क्रॉस मूल अनुरोधों की अनुमति नहीं है और जब तक आप सभी होस्ट * से क्रॉस मूल अनुरोध खोलते हैं, तो यह समस्या हल नहीं होगी।

    इसे कई तरीकों से तय किया जा सकता है लेकिन वे वास्तव में लंबे हैं।वेब सर्वर के बजाय स्थानीय भंडारण से http://

    लोड पूरी वेबसाइट से

    लोड एचटीएमएल। यह क्रॉस मूल अनुरोधों के साथ सभी मुद्दों को हटा देता है। लाभ यह है कि जब आप यूआई बदलते हैं तो आपको ऐप के नए संस्करण को प्रकाशित करने की आवश्यकता नहीं होती है। लेकिन आपको बहुत शक्तिशाली कैशिंग लागू करना होगा और पहली बार खोलने वाले ऐप में अधिक समय लगेगा।

    अवरोधन http:// और उद्धार स्थानीय फ़ाइलों

    आप जानते हैं, phonegap बस WebView का उपयोग करता है, सभी प्लेटफार्मों में, आप बस यूआरएल प्रोटोकॉल को अपने ऐप्लिकेशन के स्थानीय संग्रहण से फ़ाइलों को सुई ओवरराइड कर सकते हैं। यह तेज़ होगा, और ब्राउज़र सोचता है कि यह उसी संसाधन से HTML लोड कर रहा है।

    सेटअप प्रमाणीकरण

    1. पुनर्निर्देशन अपनी वेबसाइट पर होस्ट एक प्रवेश पृष्ठ पर के लिए OAuth + कस्टम हेडर http://domain.com/api/login
    2. कहना सफल प्रवेश के बाद, PhoneGap localStorage (नहीं ब्राउज़र की localStorage) का उपयोग प्राधिकरण स्टोर करने के लिए।
    3. ऐप से अपने स्थानीय HTML पृष्ठों पर नेविगेट करें और प्रत्येक जेसन एपीआई अनुरोध के लिए आप सर्वर पर भेजें, प्राधिकरण शीर्षलेख को AJAX अनुरोध में अलग शीर्षलेख के रूप में भेजें।
    4. सेटअप एक प्राधिकरण मॉड्यूल, जहां आप मैन्युअल asp.net अनुरोध अधिकृत कर सकते हैं यदि आपके प्राधिकरण http अनुरोध
    +0

    विस्तृत उत्तर के लिए धन्यवाद। मुझे लगता है कि आप सही हैं, इसे हल करने का उचित तरीका ओएथ या इसी तरह के प्रमाणीकरण विधि को बदलना है। – balzafin

    0

    MSDN के अनुसार:

    FormsAuthentication.SignOut विधि कुकी से रूपों प्रमाणीकरण टिकट की जानकारी निकाल देता है।

    और यह सब आपको उपयोगकर्ता को लॉग आउट करने की आवश्यकता है। आपको अपनी कुकी को समाप्त या निकालने की आवश्यकता नहीं है। बस अपने Logout() को:

    [ActionName("logout")] 
    [AllowAnonymous] 
    public String Logout() 
    { 
        FormsAuthentication.SignOut(); 
        return "home"; 
    } 
    
    1

    मुझे विश्वास है कि मुझे समाधान मिला है। आपकी config.xml फ़ाइल पर फोनगैप संस्करण क्ली-5.1.1 है, जिसमें documentation के अनुसार एंड्रॉइड फोनगैप संस्करण 4.0.2 शामिल है।

    संस्करणों के साथ समस्या यह है कि एंड्रॉइड फोनगैप टीम ने अंततः संस्करण 5.2.0 पर कुकी स्टोरेज समस्या को ठीक किया है।

    CB-10896 WebView उचित

    इसलिए, नवीनतम संस्करण के लिए अपने Phonegap अद्यतन करने से समस्या का समाधान करना चाहिए पर हम कभी कुकीज़ सक्षम: यह रूप में release notes में पाया जा सकता।

    +0

    आपको OP की config.xml फ़ाइल कहां मिली? – MarioDS

    +0

    मुझे नहीं लगता कि मुझे सवाल मिल गया है। क्या आप अधिक विस्तार से बताएंगे? –

    +0

    दुर्भाग्य से इसने समस्या को हल नहीं किया। मैं अब क्ली-6.3.0 (एंड्रॉइड 5.2.1) का उपयोग कर रहा हूं और लॉगिन/लॉगआउट बिल्कुल वही व्यवहार करता है। – balzafin

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