IInternetSecurityManager URLACTION_CROSS_DOMAIN_DATA 和 Webbrowser 控制中跨域 XMLHTTP 请求的异步可插入协议

Posted

技术标签:

【中文标题】IInternetSecurityManager URLACTION_CROSS_DOMAIN_DATA 和 Webbrowser 控制中跨域 XMLHTTP 请求的异步可插入协议【英文标题】:IInternetSecurityManager URLACTION_CROSS_DOMAIN_DATA and Asynchronous Pluggable Protocol for cross domain XMLHTTP requests in webbrowser control 【发布时间】:2014-04-23 07:25:33 【问题描述】:

我已经使用 C# 在 .net 2.0 应用程序中实现了异步可插拔协议,它将存储在本地计算机上的 html 文件加载到 MemoryStream 中。

当我使用本地文件路径在 webbrowser 控件中正常加载 html 文件时,xmlhttprequest 工作正常,但通过协议加载文件并尝试使用 xmlhttprequest 返回访问被拒绝错误。

我推测这种行为是由于 webbrowser 控件不再知道 html 文件存储在本地计算机上,并且正在将它们加载到不受信任的 Internet 区域中。

即使我在 IInternetSecurityManager 的 ProcessUrlAction 中为 URLACTION_CROSS_DOMAIN_DATA 返回 S_OK,我用断点检查以确保它被触发,但我的 IInternetSecurityManager 的此操作的返回值被忽略了。

我尝试在 IInternetSecurityManager 的 MapUrlToZone 中为我的协议 URL 将 pdwZone 设置为 tagURLZONE.URLZONE_LOCAL_MACHINE 并使用 GetSecurityId 进行了一些操作,尽管我不确定我在做什么并且破坏了其他事情,例如允许脚本加载等...似乎没有什么可以允许跨域 xmlhttprequest。

任何人都知道我怎样才能让它工作。

【问题讨论】:

你可以试试feature control,但我对此不抱太大希望。使用基于 HttpListener 的小型应用内 Web 服务器和用户 http://localhost 而不是您的自定义 APP 处理程序,您可能会更好。 @Noseratio 感谢您的评论。我正在处理的项目不是单实例,并且可以在一台机器上运行多达 20 次,所以我不喜欢 http 侦听器方法,最初我不喜欢潜在的防火墙问题的想法。我确定APP是应该完成的方式。 GetSecurityId 这里的实现对我不起作用:link cEXWB2 at link 有不同的签名,对我也不起作用://private const string m_strSecurity = "None:localhost+My Computer"; int IInternetSecurityManager.GetSecurityId(string pwszUrl, IntPtr pbSecurityId, ref uint pcbSecurityId, ref uint dwReserved) //pbSecurityId = Marshal.StringToCoTaskMemAnsi(m_strSecurity); //pcbSecurityId = (uint)m_strSecurity.Length; //return Hresults.S_OK; return (int)WinInetErrors.INET_E_DEFAULT_ACTION; 我找不到太多关于它的信息。 JasperS,您可能正在按照应有的方式进行操作。只是我有一种感觉,从IE9开始,APP的东西就被微软默默地弃用了,从那以后也没有得到很好的测试和维护。你试过玩FEATURE_PROTOCOL_LOCKDOWNFEATURE_LOCALMACHINE_LOCKDOWN吗? @Noseratio doh,我刚刚查看了我的提供者代码,并意识到我在IntPtr 上缺少ref。不过,这对我奇怪的IHostBehaviorInit 问题没有任何影响:( 【参考方案1】:

不是真正的答案,但它可能有助于隔离问题。我首先在 C++ 中实现这个 APP 处理程序,并使用一些健壮的非托管 WebBrowser ActiveX 主机示例对其进行测试,例如 Lician Wishick 的 Webform:

http://www.wischik.com/lu/programmer/webform.html

如果我能让它在非托管主机上可靠地工作,我会继续 C# 实现。

我还尝试将FEATURE_BROWSER_EMULATION 设置为8000 或更少,以模拟旧版IE 行为,只是为了检查它是否以这种方式工作。

也就是说,我不会抱太大希望。我过去做过my share of WebBrowser/MSHTML integration,我感觉自 IE9 以来,APP 支持还没有经过回归测试,支持旨在接受开放 Web 标准的新 IE 东西。

更新,MSDN隐约提到this:

成功完成后,pbSecurityId 包含方案、域、 和区域信息,以及指定的 pwszUrl 是否为 源自网络标记。

这是很久以前对我有用的格式(也许是在引入"Mark of the Web" 之前):

static const char security[] = "https:www.mysite.com\2\0\0"; // C++ puts the termination \0 for us

我相信,2 在这里代表“受信任的站点”区域。其他区域可以在这里找到:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Lockdown_Zones

希望这会有所帮助。

【讨论】:

FEATURE_BROWSER_EMULATION 设置为7000,所以这不是问题。我认为约翰正在研究您回答中的其他建议。与此同时,我们不得不解决使用 .NET 提供的等效项覆盖 XMLHttpRequestActiveXObject 的问题,这是一个我不太满意但“暂时”有效的解决方案。但是,它并不能解决 x 域 iframe 的问题。【参考方案2】:

也许我错了,但是您是否尝试过发送您的协议标头Access-Control-Allow-Origin: *

【讨论】:

Access-Control-Allow-Origin 不相关有几个原因。主要是因为大多数页面在 IE 7 模式下运行(因此 XHR 不支持 CORS),还因为主机页面使用自定义协议,并且它试图通过 http:// 进行通信。

以上是关于IInternetSecurityManager URLACTION_CROSS_DOMAIN_DATA 和 Webbrowser 控制中跨域 XMLHTTP 请求的异步可插入协议的主要内容,如果未能解决你的问题,请参考以下文章