2011-05-25 3 views
12

मैंने कुछ समय पहले इस question से पूछा और पाया कि आईई एक आईफ्रेम में क्रॉस-डोमेन कुकीज़ को ब्लॉक करता है आपने p3p policy सेट किया है। अब तक, पी 3 पी फिक्स ने यानी खूबसूरती से काम किया है। हालांकि, अब हम सफारी में एक ही त्रुटि प्राप्त कर रहे हैं।इफ्रेम, क्रॉस-डोमेन कुकीज, पी 3 पी पॉलिसी, और सफारी त्रुटि के साथ: एक आवश्यक एंटी-फोर्जरी टोकन की आपूर्ति नहीं की गई थी या अमान्य

मैं सफारी के लिए एक अलग p3p policy साथ एक लेख मिला। मैंने पी 3 पी नीति सेट अप करने के लिए यह कोड जोड़ा, लेकिन मुझे अभी भी अनुरोध सत्यापन टोकन त्रुटि मिल रही है।

public static void SetP3PCompactPolicy() 
{ 
    HttpContext current = HttpContext.Current; 

    if (current.Request.UserAgent.ToLower().IndexOf("safari") >= 0) 
     HttpContext.Current.Response.AddHeader("p3p", "CP=\"IDC DSP COR CURa ADMa OUR IND PHY ONL COM STA\""); 
    else 
     HttpContext.Current.Response.AddHeader("p3p", "CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\""); 
} 

मुझे यकीन नहीं है कि इसका कोई मतलब क्या है, लेकिन यह सफारी (5) के लिए काम नहीं कर रहा है।

इसके अलावा, जब मैं एक सर्वर त्रुटि मिलती है, सभी जानकारी मेरे लिए सब http हेडर सहित एक रिपोर्ट में भेजा जाता है। इन त्रुटियों में पी 3 पी हेडर कभी नहीं आता है। मुझे यकीन नहीं है कि यह डिज़ाइन द्वारा है या यदि यह इस मुद्दे का संकेतक है।

उत्तर

8

मुद्दा यह है कि सफारी एक कुकी एक iframe में स्थापित किया जाना जब तक कि उपयोगकर्ता कि iframe साथ सूचना का आदान अनुमति नहीं देता है। कुछ के लिए, इसका मतलब है कि एक लिंक पर क्लिक करना। मुझे एक बेहतर समाधान मिला जो एक रीडायरेक्ट करना है।

सबसे पहले, मैंने यह फॉर्म मेरे पृष्ठ पर रखा है। असल में, मैंने इसे मास्टरपेज में रखा है जिसका उपयोग आईफ्रेम में किए गए प्रत्येक दृश्य द्वारा किया जाता है।

<% if(SecurityHelper.BrowserIsSafari) { %> 
    <% using (Html.BeginForm("SafariRedirect", "Framed", FormMethod.Post, new { id="safari-fix-form" })) { %> 
     <%: Html.Hidden("safariRedirectUrl")%> 
    <% } %> 
<% } %> 

क्योंकि मैं केवल इस काम करने के लिए उपयोगकर्ता सफारी उपयोग कर रहा है जब चाहते हैं, मैं इस संपत्ति एक स्थिर सहायक कक्षा में UserAgent जाँच करने के लिए

public static bool BrowserIsSafari 
{ 
    get { return HttpContext.Current.Request.UserAgent.ToLower().IndexOf("safari") >= 0; } 
} 

तो बनाया है, मेरी नियंत्रक में, मेरे पास है

[HttpPost] 
public ActionResult SafariRedirect(string safariRedirectUrl) 
{ 
    Response.Cookies.Add(new HttpCookie("safari_cookie_fix", "cookie ok")); 

    return Redirect(safariRedirectUrl); 
} 

मेरे masterpage में निम्नलिखित कार्रवाई, शीर्ष लेख में, मैं अपने स्क्रिप्ट ही भीतर घोषित अगर बयान करता है, तो प्रपत्र प्रदान की गई है निर्धारित करता है कि। मेरी स्क्रिप्ट फ़ाइल में, मैं इस jQuery

$(function() { 

    if ($.browser.safari == true && document.cookie.indexOf("safari_cookie_fix") == -1) { 
     var url = location.href; 

     $('#safariRedirectUrl').val(url); 
     $('#safari-fix-form').submit(); 
    } 

}); 

पहली बार iframe में कोई पृष्ठ लोड है, अगर यह सफारी और कुकी सेट नहीं है, प्रपत्र पोस्ट किया जाता है, कुकी सेट, और उपयोगकर्ता है उसी यूआरएल पर वापस रीडायरेक्ट किया गया।

+0

मेरे पास बहुत ही समान समस्या है (http://stackoverflow.com/questions/6125741/iframe-cross-domain-cookies-p3p-policy-and-safari-with-error-a-required-anti) तो अगर यह मुझे आपकी टिप्पणी को मुफ्त में जोड़ने में मदद करता है और मैं आपको बक्षीस दूंगा। –

+0

एचएम मैंने कुकीज़ और मेरी सफारी रिकर्सन के साथ फॉर्म और एक्शन जोड़ा। document.cookie.indexOf ("safari_cookie_fix") हमेशा खाली है। लेकिन डेवलपर टूल्स के तहत मैं "कुकी ओके" –

+0

देखता हूं, मैं निश्चित रूप से निश्चित हूं कि ऊपररी दृष्टिकोण सफारी 4.5 में मेरे लिए काम करता है। हालांकि मैंने कुकीज को डंप कर दिया, क्योंकि आईई में सुरक्षा सेटिंग्स तीसरे पक्ष की कुकीज़ को भी ब्लॉक कर सकती है। – Josh

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