IE静默地在iframe页面(SSL)上删除cookie?

时间:2014-12-09 15:51:27

标签: internet-explorer iframe ssl cookies forms-authentication

我在多域网络应用程序中遇到iframe和Cookie问题。

就在我开始之前,我非常清楚domain1上的application1无法在domain2上访问或设置application2的cookie。所以这不是初学者的问题。

问题如下:
我有网站1,位于 https://test.xyz-abc.ch/FM_xyz/w8/index.html

和报告服务器(website2),位于 https://www8.company-asp.ch/ReportServer

问题的缩小版本是:

我把这个内容

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Test Page</title>
    </head>

<body>
    <iframe src="www8.company-asp.ch/ReportServer/login.aspx" width="1000" height="1000" ></iframe>
</body>
</html>

带有URL的文件“ifrm.html” https://test.xyz-abc.ch/FM_xyz/w8/ifrm.html

现在无论我在报表服务器表单上输入的用户名/密码是什么,它都不起作用(用户名和密码是正确的120%,并且存在且具有所有必要的权限)。

如果我在Google Chrome或Firefox上做同样的事情,那么它可以工作,我可以登录iframe中包含的Report-Application。

但是在Internet Explorer中,您可以(尝试)登录,但始终保持登录屏幕,因为由于未知原因,它既不会创建cookie,也不会发送cookie。

如果我在iframe外部运行reportserver,我可以在Internet Exploder中登录并打开报告。
请注意,ReportServer在表单身份验证(带cookie)上运行,而不是Windows身份验证。

此外,问题不是特定于ReportServer,我可以将任何使用cookie进行身份验证的应用程序放在那里,而且它们也会失败 - 但只有在Internet Exploder中,一切都在Chrome和Firefox中正常运行。

我发现这很奇怪,因为 - 如果我在上面运行相同的应用程序(site1) https://www6.company-asp.ch/FM_xyz/w8/index.html
并在同一域上有reportserver https://www8.company-asp.ch/ReportServer
,然后它的工作原理。

有人知道问题是什么或可能是什么(我的意思是除了IE是一个sh * t软件的事实)?
我唯一可以想到的是工作变量和非工作变量之间的区别在于主域(两个示例中的子域不同)是不同的。

这是IE中的(按设计)SSL问题(=严重错误吗?),或者这可能是SSL / SSL证书配置错误的问题?

修改
是的,我知道我可以在<see below>中禁用它,但这不是一个可接受的解决方案。我不能告诉客户告诉他的所有员工在他们的IE中改变这个设置。首先,它永远不会起作用,第二,他们可能没有权限改变这些设置,第三,IT部门可能不允许它,无论出于何种原因,第四,因为要求客户改变其浏览器的设置是愚蠢的。 。
P3P

编辑2:
情况变得更糟。它是P3P,我通过web.config使用P3P头在我的测试域上工作。
但是,无法在ReportServer的web.config中添加P3P标头,因为它在某种内部IIS6上运行。

2 个答案:

答案 0 :(得分:0)

试试这个:

1.打开Internet Explorer,选择工具|互联网选项

2.单击“安全”选项卡

3.选择互联网区域

4.向下滚动到&#34;启动IFRAME中的程序和文件&#34;

5.选择启用

6.单击“确定”

答案 1 :(得分:0)

这确实是P3P的工作。
精湛的IE巨魔级别。

The solution:

通常的解决方法是将自定义标头添加到web.config文件的system.webServer部分。

<system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>


    <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>

但是,由于SSRS是理所当然的,因此它们在内部使用IIS6 / Cassini(即使在使用IIS 7.5的操作系统上)。 因此,您无法在web.config文件中添加标头,因为system.webServer是IIS7 +。

将带有内联标记的标题放入aspx页面是不够的,也不起作用

<%
    System.Web.HttpContext.Current.Response.AppendHeader("P3P", "CP=\\\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\\\"");
 %>

所以你需要编写一个自定义http模块,在每个响应中添加P3P-Header ...
这很简单,如果ASP.NET没有错误并且在请求结束之前不会调用EndRequest,那么在请求发送后再次调用一次......

所以这是最终结果:

namespace CustomHttpHeaders
{


    public class CustomHttpHeaderModule : System.Web.IHttpModule
    {


        public void Dispose()
        {
            // CustomHttpHeaders.CustomHttpHeaderModule mod = new CustomHttpHeaderModule();
        }


        public void Init(System.Web.HttpApplication context)
        {
            // context.BeginRequest += new System.EventHandler(context_BeginRequest);
            context.EndRequest += new System.EventHandler(context_EndRequest);
        }


        void context_BeginRequest(object sender, System.EventArgs e)
        {
            if (System.Web.HttpContext.Current != null && System.Web.HttpContext.Current.Request != null)
            {
                System.Web.HttpRequest request = System.Web.HttpContext.Current.Request;
                // request.Headers.Add("name", "value");
            } // End if (System.Web.HttpContext.Current != null && System.Web.HttpContext.Current.Response != null)
        }


        void context_EndRequest(object sender, System.EventArgs e)
        {
            if (System.Web.HttpContext.Current != null && System.Web.HttpContext.Current.Response != null)
            {
                System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;

                try
                {
                    // OMG - WTF ??? non-redundant redundancy ^3 
                    // response.Headers["P3P"] = "CP=\\\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\\\"":
                    // response.Headers.Set("P3P", "CP=\\\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\\\"");
                    // response.AddHeader("P3P", "CP=\\\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\\\"");
                    response.AppendHeader("P3P", "CP=\\\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\\\"");
                }
                catch(System.Exception ex)
                {
                    // WTF ? 
                    System.Console.WriteLine(ex.Message); // Suppress warning
                }

            } // End if (System.Web.HttpContext.Current != null && System.Web.HttpContext.Current.Response != null)

        } // End Using context_EndRequest


    } // End Class myHTTPHeaderModule


} // End Namespace CustomHttpHeaders

然后,您可以在ReportServer的web.config文件中添加CustomHttpHeaderModule。
Weeeee:O =

  [...]
  <httpModules>
    <clear />
    <add name="CustomHttpHeaders" type="CustomHttpHeaders.CustomHttpHeaderModule, CustomHttpHeaders" />
  </httpModules>

</system.web>

如果要在Visual Studio 2013(IIS Express)中调试它,您也需要它(在web.config文件中)

<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>

<modules runAllManagedModulesForAllRequests="true" >
  <add name="CustomHttpHeaders" type="CustomHttpHeaders.CustomHttpHeaderModule, CustomHttpHeaders" />
</modules>


<!--
<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>
-->