【问题标题】:Session null in IFrame in ASP.net MVC only in safari browserASP.net MVC 中 IFrame 中的会话 null 仅在 safari 浏览器中
【发布时间】:2013-11-22 13:33:04
【问题描述】:

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

我正在使用 MVC 4.5 一切都可以在其他浏览器中完美运行。我正在使用下面的代码..

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

【问题讨论】:

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


    【解决方案1】:

    我们完全遇到了同样的问题 - FB 应用程序在 ASP.Net MVC 项目的 Safari 中无法运行。以下是我们为修复它所做的:

    1. 将 P3P 标头添加到所有 reposons。您可以在 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

    这是我的 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>
    

    【讨论】:

    • 有人知道这是否仍然有效吗?还是苹果也修补了这个?
    • 将此添加到我们的一个 Facebook 应用程序中,但它似乎不起作用(使用 Safari)。 :(
    • @Jag 你有没有找到适合你的解决方案?我还尝试了此处描述的解决方案,但我的 Facebook 应用程序中的 Safari 仍然存在问题。您可能找到的任何答案将不胜感激。
    【解决方案2】:

    Safari 设置为默认不接受 3rd 方 cookie。这意味着当您访问域 A 并将域 B 嵌入 iframe 时,它​​不会接受来自 B 的 cookie,直到用户与 iframe 的内容进行交互。

    在开发需要会话的 facebook 应用程序并且客户端不接受告诉用户启用 3rd 方 cookie 的解决方案时,这种情况让我很不爽。这是我实施的解决方法,并且一直在使用:

    • 检查 User-Agent 标头是否包含字符串 Safari
    • 检查我们是否根本没有收到任何 cookie
    • 如果以上两个都成立,发出一个 javascript 重定向到我的域,到一个特殊的 cookiefix 页面(意思是以下输出:&lt;script&gt;top.location = "http://example.com/cookiefix";&lt;/script&gt;) - 需要 JS 来摆脱 iframe
    • 在该页面上除了设置一个虚拟会话变量之外什么都不做
    • 重定向到原始页面并享受我的会话 cookie,它在技术上是一个 3rd 方 cookie,但它已经被接受并且不需要更改

    【讨论】:

    • 这实际上适用于 Facebook 应用程序。请求权限后,您已经重定向到您的应用程序。您只需要在那里建立一个会话(以便设置 cookie),一切都会正常工作(TM)。
    • @apfelbox 对于我的用例我需要在应用验证之前进行会话,所以我需要我的解决方法。
    【解决方案3】:

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

    【讨论】:

    • 我没有投反对票 - 但我同意投反对票的人 - 你的回答如何帮助(甚至回答)这个问题?他已经知道 cookie 不起作用..
    • @avs099 问题是会话为空。首先要检查的诊断事项之一是是否保留了会话 ID。会话仍然可以从代码问题中为空。在 OP 中实际上根本没有提到 Cookie。由于默认会话提供程序将重新生成 id,这可以让您知道值是否正在清除、被保留等。这是一个鲜为人知的事情。我之前写过会话提供程序代码,因此在这里使用一些知识来尝试获取更多诊断信息。这有助于确定 cookie 是到达客户端还是返回服务器,这是必不可少的第一个跟踪步骤。
    【解决方案4】:

    一种方法是禁止 cookie 从不阻止它。按以下方式。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      • 2016-06-17
      相关资源
      最近更新 更多