2013-02-04 55 views
17

के लिए काम नहीं कर रहा यह सेवा उपयोगकर्ताओं को प्रमाणित करने के लिए प्रयोग किया जाता है नेट 4. पर किसी asp.NET WCF है। हम एक उपयोगकर्ता नाम और पासवर्ड जमा कर रहे हैं और फिर एक HTTP शीर्षलेख प्रमाणीकरण कुकी शामिल के साथ वापस किया जाना चाहिए। स्थानीय रूप से होस्ट किए गए परीक्षण पृष्ठ का उपयोग करके यह सही तरीके से काम कर रहा है। अब मैं हेडर जानकारी क्रॉस डोमेन तक पहुंचने का प्रयास कर रहा हूं। मैंने अपने टेस्ट पेज को एक अलग मशीन पर स्थापित किया है और डब्ल्यूसीएफ में कॉल करने के लिए कॉन्फ़िगर किया है। कॉल काम कर रही है और कॉल में 'डेटा' जवाब सही है।xmlHttp.getResponseHeader + CORS

alert(xmlHttp.getAllResponseHeaders()); 

या

alert(xmlHttp.getResponseHeader("Set-Cookie")); 

IE में डिबगर और 'लाइव HTTP हेडर' का उपयोग Firefox के लिए में प्लग, मैं कर सकते हैं: हालांकि, मैं निम्नलिखित में से किसी के साथ शीर्ष लेख जानकारी का उपयोग करने में असमर्थ हूँ देखें हेडर जानकारी वापस आ रही है।

मेरी वैश्विक ajax पेज में मैं प्रतिक्रिया CORS को संभालने के लिए स्थापित कर रहा हूँ।

private void EnableCrossDomainAjaxCall() 
{ 
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); 


    if (HttpContext.Current.Request.HttpMethod == "OPTIONS") 
    { 

     HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache"); 
     HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE"); 
     HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept"); 

     HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000"); 
     HttpContext.Current.Response.End(); 
    } 

} 

यह AJAX मैं सेवा को कॉल करने का उपयोग कर रहा है:

$("#btnLogin").click(function (e) { 
      var geturl; 
      geturl = $.ajax({ 
       // type: "POST", 
       type: "GET", 
       contentType: "application/json; charset=utf-8", 
       url: 'http://10.0.4.66/AuthenticationService.svc/Login?Name=test&password=pwsd', 
       // url: '../SecurityServer/AuthenticationService.svc/Login?Name=test&password=pwsd', 
       dataType: "jsonp", 
       error: function (request, status, error) { 
        alert('Error Occured'); 
       }, 
       crossdomain: true, 
       success: function (data, textStatus, xmlHttp) { 
        // alert(xmlHttp.getResponseHeader("Content-Type")); 
        document.write(xmlHttp.getResponseHeader("Content-Type") + "<br/>"); 
        alert(xmlHttp.getAllResponseHeaders()); 
        alert(xmlHttp.getResponseHeader("Set-Cookie")); 
        var headers = ''; 
        var headerPair = xmlHttp.getAllResponseHeaders('wcfCookie').split("\r\n"); 
        var output = ''; 
        $.each(headerPair, function (key, line) { 
         var parts = line.split(':'); 

         if (parts[0] == 'wcfCookie') { 
          ChocChip = parts[1] 
          return false 
         } 

        }); 

       } 

      }); 

नीचे मेरी हेडर सूचना 'लाइव HTTP हेडर'

Date: Mon, 04 Feb 2013 12:12:40 GMT 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET 
X-AspNet-Version: 4.0.30319 
Access-Control-Allow-Origin: * 
Set-Cookie: wcfCookie=8D38D5D6A0F138FEB595DD016F7694EDDF3E6757C82ED3D419F5047A5294974C1885487465CEC0A0BCC2B3802C7B03FF9F5370A05D4CCBDDDABCB1558C3816044BF4F78209BF38C6B1A7CAD34CD3C85C40B8515CFB1C2B2694BC78803D8DACB4 
Content-Length: 65 
Cache-Control: application/json; charset=utf-8 
Content-Type: application/x-javascript 

उत्तर

0

ब्राउज़र की सुरक्षा नीतियों से पकड़ लिया है हो सकता है आपकी प्रतिक्रिया ब्लॉक क्योंकि आप सेट नहीं किया है:

HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials","true"); 

अगर वह मदद नहीं करता है, अपने ajax विकल्प के लिए

xhrFields: { withCredentials: true } 

जोड़ने भी एक शॉट के लायक हो सकता है की कोशिश करो।

55

सबसे पहले, एक छोटे पृष्ठभूमि:

आप Access-Control-Allow-Headers उपयोग कर रहे हैं, जो जो अनुरोध निर्दिष्ट करता हेडर ग्राहक करने की अनुमति है भेजने के लिए, लेकिन आप निर्दिष्ट नहीं कर रहे जो प्रतिक्रिया हेडर ग्राहक है करने की अनुमति दी पढ़ें। ग्राहक गैर सरल प्रतिक्रिया हेडर को पढ़ने के लिए अनुमति देने के लिए, आपको Access-Control-Expose-Headers उपयोग करने के लिए की जरूरत है। HTML5 Rocks CORS page से:

एक CORS अनुरोध के दौरान, getResponseHeader() विधि केवल सरल प्रतिक्रिया हेडर पहुँच सकते हैं।

  • कैश-नियंत्रण
  • सामग्री-भाषा
  • सामग्री प्रकार
  • समय-सीमा समाप्त
  • Last-Modified
  • Pragma

हैं: सरल प्रतिक्रिया हैडर परिभाषित कर रहे हैं आप ग्राहकों को अन्य हेडर उपयोग करने में सक्षम होना चाहता हूँ, आप Access-Control-Expose-Headers उपयोग करने के लिए हैडर।इस हेडर का मान उस प्रतिक्रिया शीर्षलेख की अल्पविराम-सीमित सूची है जिसे आप क्लाइंट को बेनकाब करना चाहते हैं।

तो, यह देखते हुए कि नई जानकारी है, तो आप क्या कर सकते हैं:

HttpContext.Current.Response.AddHeader("Access-Control-Expose-Headers", "Set-Cookie"); 

... लेकिन यह है कि तुलना में यह करने के लिए अधिक नहीं है।

अब, वास्तविक जवाब:

एक और अधिक गंभीर यहाँ समस्या नहीं है: एक्सएचआर विनिर्देश explictily disallows reading Set-Cookie। ऐसा इसलिए है क्योंकि यह कार्यात्मक रूप से क्रॉस-डोमेन कुकी-चोरी हमले है।

मान लीजिए डोमेन ए डोमेन बी के लिए एक क्रॉस-डोमेन अनुरोध करता है। जब डोमेन बी कुकीज़ सेट करता है, तो यह डोमेन बी के लिए डोमेन-विशिष्ट कुकीज़ सेट कर रहा है, केवल। डोमेन बी की कुकीज़ को पढ़ने के लिए डोमेन ए द्वारा किए गए किसी भी प्रयास कुकी एक्सेस के लिए समान मूल नीति का उल्लंघन है।

मैं जैसे WCF पता नहीं है, इसलिए मैं का सबसे अच्छा तरीका के बारे में सुनिश्चित नहीं कर रहा हूँ वास्तव में आप क्या चाहते हैं, लेकिन मुझे लगता है कि चाहते हैं समाधान कुकीज़ के माध्यम से नहीं एक प्रमाणीकरण टोकन पारित करने के लिए हो सकता है (, X-WCF-Auth हेडर?) कि डोमेन ए पढ़ता है और फिर अपनी कुकी सेट करता है।