不使用对话框调用自定义IInternetSecurityManager

你好,谢谢你的期待。

问题描述:

我已经实现了嵌入浏览器控件的ac#WinForm应用程序,并实现了IInternetSecurityManager来执行我们需要的任务,以允许在iframe中使用我们本地安装的网页进行跨域访问。

使用IInternetSecurityManager,IOleClientSite,IDocHostShowUI和IDocHostUIHandler,所有事情都按预期工作。 换句话说,我们所有的实现都被浏览器控件调用。

问题是当浏览器控件中加载的网页具有调用window.showModalDialog()的脚本时:正在使用的浏览器控件实例不再与我们的客户端站点通信。 绝对没有QueryInterface调用或在上面提到的任何接口中调用任何其他方法。

对话框中的文档没有使用我假设的安全管理器实现,因为IE显示的对话框中的Web浏览器控件与我们称为SetClientSite()的对象不同。

题:

我们如何与这个新的浏览器控件交谈? 我们需要能够在IE(我们的IInternetSecurityManager实现)所显示的对话框中提供浏览器控件。 但是,我们永远不会有机会告诉它关于我们的客户网站,可以这么说。 换句话说,没有来自IE的通信通过一个界面告诉我们,“我是一个由IE创建的新浏览器控件,这里是我的IUnknown界面。这是你设置我的客户端站点等的机会” 如果IE收到这样的通知我们会很好。

结果是正在使用两个不同的安全上下文,并且我们的应用程序在使用iframe的对话框中失败,因为我们的IInternetSecurityManager实现未被使用。

源代码示例:

我已经凿掉了源代码来保护无辜者:)并且减少了我认为你可以在自己的Visual Studio 2010解决方案中使用的东西。

请阅读ReadMe.txt文件,了解有关问题,重复步骤等的信息。

我编写的测试网页显示了指导您完成样本使用的信息和步骤。

如果您对我要完成的工作或样品不够清楚有疑问,请告诉我。

请指教。 谢谢。

http://home.comcast.net/~lowrider2112/bin/TestIEHost.rar

您可以覆盖Web浏览器的控制方法CreateWebBrowserSiteBase

 protected override WebBrowserSiteBase CreateWebBrowserSiteBase() { return new ExtendedWebBrowserSite(this); } 

并实现ExtendedWebBrowserSite如下所示:

 class ExtendedWebBrowserSite : WebBrowser.WebBrowserSite, IDocHostShowUI, IfacesEnumsStructsClasses.IServiceProvider, IInternetSecurityManager ... 

这可以调用类IInternetSecurityManager

一种选择是使用另一个自定义安全性WebBrowser控件创建自己的对话框表单(在C#中)。 然后你可以从Javascript调用C#来打开表单,而不是使用showModalDialog。