2013-03-22 5 views
11

मेरे पास एक ऐसा ऐप है जो एचटीटीपीएस के माध्यम से एक एपीआई में उपयोगकर्ता नाम और पासवर्ड भेजता है। एपीआई HTTP केवल कुकीज़ देता है।विंडोज फोन पर HTTPOnly कुकीज़ को सुरक्षित करना

इसका मतलब है कि कुकीज़ कोड के लिए "अदृश्य" हैं, लेकिन अभी भी मौजूद हैं और बाद के अनुरोधों में सर्वर को भेजी जाएंगी।

Set-Cookie हैडर HttpWebResponse.Headers से छीन लिया जाता है और कुकी HttpWebResponse.Cookie या HttpWebRequest.CookieContainer में प्रकट नहीं होता। हालांकि, यदि कोई अनुरोध उसी HttpWebRequest.CookieContainer का उपयोग करके किया जाता है तो उन्हें सर्वर पर भेजा जाता है, लेकिन वे कोड के लिए पहुंच योग्य नहीं हैं।

जहां तक ​​मैं कह सकता हूं, इससे उन्हें किसी भी तरह से क्रमबद्ध या संरक्षित करना असंभव हो जाता है। ऐसा लगता है कि यह काम वास्तविक उपयोगकर्ता नाम और पासवर्ड को कैश करने और हर बार फिर से लॉगिन करने का एकमात्र तरीका होगा।

क्या मुझे कुछ याद आ रही है?

+0

क्या आप पूरे 'कुकी कोंटेनर' (http://answers.flyppdevportal.com/categories/metro/csharpvb.aspx?ID=d214c388-41de-44b7-8260-9e21f3fcb859) को क्रमबद्ध कर सकते हैं और आवश्यक होने पर पूरे कंटेनर का पुन: उपयोग कर सकते हैं? – keyboardP

+0

आप httponly कुकी में हेरफेर नहीं कर सकते हैं। जब आप http अनुरोध भेजते हैं तो वे केवल तभी संशोधित होते हैं। सर्वर और क्लाइंट के बीच सुरक्षित संचार के लिए यह आवश्यक है। तो आप जिस व्यवहार का सामना कर रहे हैं वह सामान्य है। – user568109

+0

@keyboardP यदि आप कुकी कंटैनर को क्रमबद्ध करते हैं, जब यह अनसुलझा होता है तो कुकीज़ अब नहीं भेजी जाती हैं। – zi3guw

उत्तर

3

कुकी कंटेनर में संग्रहीत कुकीज़ को देखने के लिए आपको प्रतिबिंब का उपयोग करना होगा।

इस तरह की कुछ चीज़ों का उपयोग करने के लिए इसका उपयोग करें, फिर आप अपने इच्छित डेटा तक पहुंच प्राप्त करने के लिए उप-वर्ग का प्रयास कर सकते हैं या कुकी में मेमोरी को संग्रहीत करने की प्रक्रिया के माध्यम से इसे कंटेनर से हटा सकते हैं, फिर इसे सामान्य कुकी

public List<Cookie> GetAllCookies(CookieContainer cc) 
    { 
     List<Cookie> lstCookies = new List<Cookie>(); 

     Hashtable table = (Hashtable)cc.GetType().InvokeMember("m_domainTable", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance, null, cc, new object[] { }); 

     foreach (var pathList in table.Values) 
     { 
      SortedList lstCookieCol = (SortedList)pathList.GetType().InvokeMember("m_list", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance, null, pathList, new object[] { }); 
      foreach (CookieCollection colCookies in lstCookieCol.Values) 
       foreach (Cookie c in colCookies) lstCookies.Add(c); 
     } 

     return lstCookies; 
    } 
    public string ShowAllCookies(CookieContainer cc) 
    { 
     StringBuilder sb = new StringBuilder(); 
     List<Cookie> lstCookies = GetAllCookies(cc); 
     sb.AppendLine("=========================================================== "); 
     sb.AppendLine(lstCookies.Count + " cookies found."); 
     sb.AppendLine("=========================================================== "); 
     int cpt = 1; 
     foreach (Cookie c in lstCookies) 
      sb.AppendLine("#" + cpt++ + "> Name: " + c.Name + "\tValue: " + c.Value + "\tDomain: " + c.Domain + "\tPath: " + c.Path + "\tExp: " + c.Expires.ToString()); 

     return sb.ToString(); 
    } 
+0

क्या आपको WindowsA फ़ोन पर गैर-सार्वजनिक प्रकारों तक पहुंचने के प्रतिबिंब का उपयोग करते समय MethodAccessException नहीं मिलता है? हर बार जब मैंने ऐसा करने का प्रयास किया है तो यह विफल हो गया है। – calum

+0

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

+0

मैं इस कोड को WP8 पर भी संकलित नहीं कर सकता (हैशटेबल, सॉर्टेडलिस्ट गायब हैं)। – altso

1

आप कुकीज़ को सीधे प्राप्त करने के लिए टीसीपी सॉकेट का उपयोग करने का भी प्रयास कर सकते हैं। यहां एक समान प्रश्न के लिए मेरा उत्तर दिया गया है: https://stackoverflow.com/a/21737087/262036

एक बार जब आप प्रतिक्रिया प्राप्त कर लेते हैं तो आप कुकी के लिए स्ट्रिंग को पार्स करते हैं और मूल्य को पकड़ते हैं। इसके बाद आप कुकी कोंटेनर में एक नई कुकी बना सकते हैं जो केवल एचटीपी नहीं है और इसे अगले अनुरोधों में उपयोग करें।

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