报告查看器显示 asp.net 会话在 IE 中的 iframed 提供商托管应用程序中已过期
Report viewer gives asp.net session expired in an iframed provider hosted app in IE
我正在使用带 JQuery 的 MVC 处理提供商托管应用程序,并且需要在 SharePoint 页面的 iframe 中显示 提供商托管应用程序 以使其看起来就像它集成在 SharePoint 中一样。此应用程序包含一个报告查看器(版本 10.0.0.0),在 IE10 或更高版本 中查看时显示 'Asp.net session has expired or could not be found'。在任何其他浏览器(Chrome、Mozilla)中查看时,SharePoint 页面中的此应用程序工作正常,但在 IE 中无法正常工作。
观察:
- 当应用程序 运行 直接在浏览器 i.e.without 中使用 iframe 时,它工作正常。
- 当直接在浏览器中打开应用程序后查看 Sharepoint 页面时,即在不同的选项卡中,它可以正常工作。
- 但是第一次打开浏览器查看,没有直接在浏览器中打开应用程序实例时,显示错误:
'Asp.net 会话已过期或无法找到'
已经尝试过的东西:
- 增加 iframe 的超时以及 web.config 文件中的应用程序。
- 将报表查看器的 KeepSessionAlive 和 AsyncRendering 设置为 false 和 true。
- 报告服务器超时和所有配置。
- 将 sessionMode 用于 InProc、SQLServer。
- 将 cookieeLess 设置为 true。
None 这些都适用于我的场景,我为此苦苦挣扎了一个星期。第一次注册时似乎出现了一些问题,当应用程序直接打开时,它会注册并运行。任何帮助将不胜感激。
P.S.: 我已经在 web.config 文件中注册了报表查看器。
谢谢。
伙计们,我终于解决了自己的问题。感谢mwwallace8在评论中提供的提示
问题: IE 不允许我们以 cookie 的形式存储第三方 session 数据。这是因为它为 iframe 页面提供了较低级别的信任,因此 iframe 的 session 数据不会存储在 cookie 中。因此,当我们提交表单并进行 post 调用时,服务器没有收到请求中的任何 session 数据,并认为这是第一个请求。此过程生成一个新的 Session ID 并在响应中发回。当响应返回时,响应中的Session ID是新的,它认为之前的session expired.This产生了上述问题。
与我们直接在新标签页中打开应用程序不同,它会将其视为第一方并以 cookie 的形式存储其 session 数据。
因此,一旦我们直接在新标签页中打开应用程序,一切都运行得非常完美。
解决方案: IE 需要 P3P headers(Platform for Privacy Preference Project) 来验证 iframe 中的 session 运行。此 header 将说明 iframe session 的目的是什么以及它将从浏览器 cookie 中获取何种数据。这有点像进入 IT 公司前刷门禁卡。那么问题是如何生成这个P3Pheader?答案在这里:转到web.config文件并在配置标签中添加此代码
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="p3p" value="CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT""/>
</customHeaders>
</httpProtocol>
</system.webServer>
这将创建一个 header 证书,即 P3P header 证书,它将验证 iframe session 数据以存储在浏览器 cookie 中。
要了解这些值的实际含义,请转到 This Link。您会在此处找到有关 P3P header 的大量信息。
希望这可能对某人有所帮助。
干杯..
我正在使用带 JQuery 的 MVC 处理提供商托管应用程序,并且需要在 SharePoint 页面的 iframe 中显示 提供商托管应用程序 以使其看起来就像它集成在 SharePoint 中一样。此应用程序包含一个报告查看器(版本 10.0.0.0),在 IE10 或更高版本 中查看时显示 'Asp.net session has expired or could not be found'。在任何其他浏览器(Chrome、Mozilla)中查看时,SharePoint 页面中的此应用程序工作正常,但在 IE 中无法正常工作。
观察:
- 当应用程序 运行 直接在浏览器 i.e.without 中使用 iframe 时,它工作正常。
- 当直接在浏览器中打开应用程序后查看 Sharepoint 页面时,即在不同的选项卡中,它可以正常工作。
- 但是第一次打开浏览器查看,没有直接在浏览器中打开应用程序实例时,显示错误: 'Asp.net 会话已过期或无法找到'
已经尝试过的东西:
- 增加 iframe 的超时以及 web.config 文件中的应用程序。
- 将报表查看器的 KeepSessionAlive 和 AsyncRendering 设置为 false 和 true。
- 报告服务器超时和所有配置。
- 将 sessionMode 用于 InProc、SQLServer。
- 将 cookieeLess 设置为 true。
None 这些都适用于我的场景,我为此苦苦挣扎了一个星期。第一次注册时似乎出现了一些问题,当应用程序直接打开时,它会注册并运行。任何帮助将不胜感激。
P.S.: 我已经在 web.config 文件中注册了报表查看器。
谢谢。
伙计们,我终于解决了自己的问题。感谢mwwallace8在评论中提供的提示
问题: IE 不允许我们以 cookie 的形式存储第三方 session 数据。这是因为它为 iframe 页面提供了较低级别的信任,因此 iframe 的 session 数据不会存储在 cookie 中。因此,当我们提交表单并进行 post 调用时,服务器没有收到请求中的任何 session 数据,并认为这是第一个请求。此过程生成一个新的 Session ID 并在响应中发回。当响应返回时,响应中的Session ID是新的,它认为之前的session expired.This产生了上述问题。
与我们直接在新标签页中打开应用程序不同,它会将其视为第一方并以 cookie 的形式存储其 session 数据。 因此,一旦我们直接在新标签页中打开应用程序,一切都运行得非常完美。
解决方案: IE 需要 P3P headers(Platform for Privacy Preference Project) 来验证 iframe 中的 session 运行。此 header 将说明 iframe session 的目的是什么以及它将从浏览器 cookie 中获取何种数据。这有点像进入 IT 公司前刷门禁卡。那么问题是如何生成这个P3Pheader?答案在这里:转到web.config文件并在配置标签中添加此代码
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="p3p" value="CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT""/>
</customHeaders>
</httpProtocol>
</system.webServer>
这将创建一个 header 证书,即 P3P header 证书,它将验证 iframe session 数据以存储在浏览器 cookie 中。
要了解这些值的实际含义,请转到 This Link。您会在此处找到有关 P3P header 的大量信息。
希望这可能对某人有所帮助。
干杯..