报告查看器使得asp.net会话在IE中的iframed提供者托管应用程序中过期

时间:2016-02-19 13:34:15

标签: javascript c# asp.net iframe sharepoint

我正在使用带有JQuery的MVC使用提供商托管的应用程序,并且需要在SharePoint页面的iframe中显示提供商托管应用程序,以使其看起来像是集成在SharePoint中。此应用程序包含一个报告查看器(版本10.0.0.0),显示' Asp.net会话已过期或无法找到'在IE10或更高版本中查看时。在任何其他浏览器(Chrome,Mozilla)中查看时,SharePoint页面中的此应用程序可以正常工作,但在IE中则不行。

观察:

  1. 当应用程序直接在浏览器中运行时,即不使用iframe,它运行正常。
  2. 在浏览器中直接打开应用程序后查看Sharepoint页面,即在不同的选项卡中,它可以正常运行。
  3. 但是当第一次查看打开浏览器并且没有直接在浏览器中打开应用程序的实例时,它会显示错误: ' Asp.net会话已过期或无法找到'
  4. 已尝试过的事情:

    1. 增加iframe的超时以及web.config文件中的应用程序。
    2. 将报告查看器的KeepSessionAlive和AsyncRendering设置为false和true。
    3. 报告服务器超时和所有配置。
    4. 将sessionMode用于InProc,SQLServer。
    5. 将cookieeLess设置为true。
    6. 这些都不适用于我的场景,而且我正在努力工作一周。这似乎是第一次注册问题,当应用程序直接打开时,它会被注册并运行。任何帮助将受到高度赞赏。

      P.S。:我已在web.config文件中注册了报告查看器。

      感谢。

1 个答案:

答案 0 :(得分:0)

所以大家终于解决了我自己的问题。感谢mwwallace8在评论中提供的提示。

问题: IE不允许我们以Cookie的形式存储第三方会话数据。这是因为它对iframe页面的信任度较低,因此iframe的会话数据不会存储在Cookie中。因此,当我们提交表单并进行发布呼叫时,服务器不会在请求中接收任何会话数据,并认为这是第一个请求。此过程会生成一个新的会话ID,并将其发送回响应中。当响应返回时,响应中的会话ID和新的会话ID会认为上一个会话已过期。这会产生上述问题。

与我们直接在新标签中打开应用程序不同,它将其视为第一方,并以cookie的形式存储其会话数据。 因此,一旦我们直接在新标签中打开应用程序,一切都运行得很完美。

解决方案: IE需要P3P标头(隐私首选项平台)来验证iframe中运行的会话。此标头将说明iframe会话的意图是什么以及它将从浏览器cookie中获取哪种数据。在进入IT公司之前,它会刷入Access卡。那么问题是如何生成这个P3P头?答案如下:转到web.config文件并在配置标记

中添加此代码
<system.webServer>    
    <httpProtocol>
      <customHeaders>
        <add name="p3p" value="CP=&quot;IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT&quot;"/>
      </customHeaders>
    </httpProtocol>
  </system.webServer>

这将创建一个标头证书,即P3P标头证书,它将验证iframe会话数据以存储在浏览器cookie中。

要了解这些值的实际含义,请转到This Link。您可以在这里找到有关P3P标头的大量信息。

希望这可能有助于某人。

干杯..