我在多域网络应用程序中遇到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部门可能不允许它,无论出于何种原因,第四,因为要求客户改变其浏览器的设置是愚蠢的。 。
编辑2:
情况变得更糟。它是P3P,我通过web.config使用P3P头在我的测试域上工作。
但是,无法在ReportServer的web.config中添加P3P标头,因为它在某种内部IIS6上运行。
答案 0 :(得分:0)
试试这个:
1.打开Internet Explorer,选择工具|互联网选项
2.单击“安全”选项卡
3.选择互联网区域
4.向下滚动到&#34;启动IFRAME中的程序和文件&#34;
5.选择启用
6.单击“确定”
答案 1 :(得分:0)
这确实是P3P的工作。
精湛的IE巨魔级别。
通常的解决方法是将自定义标头添加到web.config文件的system.webServer部分。
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<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>
但是,由于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="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT""/>
</customHeaders>
</httpProtocol>
-->