仅在safari浏览器中ASP.net MVC中的IFrame中的会话为null

时间:2013-11-22 13:33:04

标签: c# asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 c#-4.0

页面包含IFrame,仅在Safari的情况下会话为空。我的Safari版本是5.1.7

我正在使用MVC 4.5 Everything在其他浏览器中完美运行。我使用以下代码..

protected override void OnResultExecuting(ResultExecutingContext filterContext)
{
     base.OnResultExecuting(filterContext);
     filterContext.HttpContext.Response.AddHeader("p3p", "CP=\"CAO PSA OUR\"");
     GetFirstError();
}

4 个答案:

答案 0 :(得分:9)

我们有完全相同的问题 - 在ASP.Net MVC项目中,FB应用程序无法在Safari中运行。以下是我们为解决这个问题所做的工作:

  1. 将P3P标头添加到所有重新发布。您可以在IIS服务器级别配置它:http://support.microsoft.com/kb/324013 - 或直接在global.asax中执行:

    protected void Application_BeginRequest(Object sender, EventArgs e)
    {
          HttpContext.Current.Response.AddHeader("P3P", "CP=\"NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT\"");
    }
    
  2. 在您网站的根目录中创建w3c文件夹(所谓的知名位置),并根据此Microsoft指南将p3p.xmlpolicy.p3p文件上传到其中: How to Deploy P3P Privacy Policies on Your Web Site

  3. 这是我的p3p.xml文件:

    <META>
      <POLICY-REFERENCES>
        <POLICY-REF about="/w3c/policy.p3p">
          <INCLUDE>/</INCLUDE>
          <COOKIE-INCLUDE/>
        </POLICY-REF>
      </POLICY-REFERENCES>
    </META>
    

    和policy.p3p(对不起,但我不知道如何将其隐藏为剧透):

    <?xml version="1.0"?>
    <POLICIES xmlns="http://www.w3.org/2002/01/P3Pv1">
        <!-- Generated by IBM P3P Policy Editor version Beta 1.12 built 2/27/04 1:19 PM -->
    
        <!-- Expiry information for this policy -->
        <EXPIRY max-age="86400"/>
    
    <POLICY
        xml:lang="uk">
        <!-- Description of the entity making this policy statement. -->
        <ENTITY>
        <DATA-GROUP>
        </DATA-GROUP>
        </ENTITY>
    
        <!-- Disclosure -->
        <ACCESS><nonident/></ACCESS>
    
        <!-- No dispute information -->
    
        <!-- Statement for group "Basic information" -->
        <STATEMENT>
            <EXTENSION optional="yes">
                <GROUP-INFO xmlns="http://www.software.ibm.com/P3P/editor/extension-1.0.html" name="Basic information"/>
            </EXTENSION>
    
        <!-- Consequence -->
        <CONSEQUENCE>
    Data collected from all Web users: access logs, and search strings (if entered).</CONSEQUENCE>
    
        <!-- Use (purpose) -->
        <PURPOSE><admin/><current/><develop/></PURPOSE>
    
        <!-- Recipients -->
        <RECIPIENT><ours/></RECIPIENT>
    
        <!-- Retention -->
        <RETENTION><indefinitely/></RETENTION>
    
        <!-- Base dataschema elements. -->
        <DATA-GROUP>
        <DATA ref="#dynamic.clickstream"/>
        <DATA ref="#dynamic.http"/>
        <DATA ref="#dynamic.searchtext"/>
        </DATA-GROUP>
    </STATEMENT>
    
        <!-- Statement for group "Cookies" -->
        <STATEMENT>
            <EXTENSION optional="yes">
                <GROUP-INFO xmlns="http://www.software.ibm.com/P3P/editor/extension-1.0.html" name="Cookies"/>
            </EXTENSION>
    
        <!-- Consequence -->
        <CONSEQUENCE>
    Cookies are used to track visitors to our site, 
    so we can better understand what portions of our site best serve you.</CONSEQUENCE>
    
        <!-- Use (purpose) -->
        <PURPOSE><develop/><tailoring/></PURPOSE>
    
        <!-- Recipients -->
        <RECIPIENT><ours/></RECIPIENT>
    
        <!-- Retention -->
        <RETENTION><business-practices/></RETENTION>
    
        <!-- Base dataschema elements. -->
        <DATA-GROUP>
        <DATA ref="#dynamic.cookies" optional="yes"><CATEGORIES><uniqueid/></CATEGORIES></DATA>
        </DATA-GROUP>
    </STATEMENT>
    
    <!-- End of policy -->
    </POLICY>
    </POLICIES>
    

答案 1 :(得分:7)

Safari已设置为默认不接受第三方Cookie。这意味着当您访问域A并将域B嵌入到iframe中时,在用户与iframe的内容进行交互之前,它不会接受来自B的Cookie。

这种情况在开发需要会话的Facebook应用程序时非常糟糕,客户端不接受告诉用户启用第三方cookie的解决方案。这是我实施的解决方法,并且从那时起一直在运行:

  • 检查User-Agent标头是否包含字符串Safari
  • 检查我们是否完全没有cookie
  • 如果上述两种情况都属实,请向我的域发出javascript重定向,发送到特殊的cookiefix页面(意思是以下输出:<script>top.location = "http://example.com/cookiefix";</script>) - JS需要淘汰iframe
  • 该页面上的
  • 除了设置虚拟会话变量
  • 外什么都不做
  • 重定向到原始页面并享受我的会话Cookie,这在技术上是第三方Cookie,但已经被接受并且不需要使用

答案 2 :(得分:0)

使用请求跟踪并查看传入请求cookie或使用调试代理查看客户端(或浏览器调试工具)上的值。饼干是否已关闭?每次从服务器到客户端时,您的会话guid是否会发生变化 - 在这种情况下,会话不会保持建立

答案 3 :(得分:-1)

一种方法是禁止cookie永远不会阻止它。以下方式。

  

转到首选项。
选择隐私
从不阻止Cookie