2011-02-14 41 views
0

你好,感谢您的期待。自定义IInternetSecurityManager没有与对话框调用

问题描述:

我已经实现了嵌入式浏览器控件C#WinForm应用程序,并实施IInternetSecurityManager,以便让与我们的本地安装的网络I帧的跨域访问执行我们所需要的任务页面。

所有的东西都像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

回答

0

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

1

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

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

和实施ExtendedWebBrowserSite这样的:

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

,可以调用类IInternetSecurityManager