2011-09-20 76 views
3

我有一个托管Web浏览器控件的Winforms应用程序。在此控件中,您还可以导航到预定义的外部网站。在Winforms Web浏览器控件上单点登录

我需要实现单点登录,以便用户不需要在每个已知的外部网站中进行身份验证。我已经有了一些想法,但很高兴听到你的意见。

这样做的最好方法是什么?

事实上,有没有这方面的东西? (编辑:浏览器如何记住登录名/密码)?

干杯

回答

1

一般来说是该网站的实现SSO的责任,客户端会自动响应该网站。由于Web浏览器控件使用IE,因此它继承了与Web浏览器相同的功能。例如,如果该网站使用Windows Authentication,那么该控件将在没有用户干预的情况下在来自该网站的挑战之后进行认证。同样,如果网站使用SAML 2.0,控件将执行必要的重定向。

由于这些是外部网站,我必须假定Windows身份验证不会很好地工作,因为服务器和客户端位于不同的域。因此,SAML听起来像是最安全的选择。

看起来好像实施SAML会对您造成问题,您需要手动完成并提交加载在控件内部的Web窗体。这可以通过访问DOM来实现,但它很快就会变得难以维护解决方案。

网络浏览器控件提供了一个document property,它提供了一个HtmlDocument对象,它允许您在页面中使用find elementsexecute JavaScript。您需要使用这些机制来自动执行身份验证。这些步骤可能如下所示:

  1. 捕获URL或一些cookie,通过检查Web浏览器控件属性可以让您知道是否需要验证。你可能想看看OnNavigate()
  2. 访问文档并填写表单值。
  3. 调用JavaScript提交函数来提交表单,或者注入一些JavaScript来执行此操作。我发现在页面中插入JavaScript比在许多情况下编写更复杂的C#代码更容易。在常规浏览器中进行原型制作更容易。
0

除非网站都有一个共同的可信认证机制(如OpenID)你坚持做定制编码为每个站点。

浏览器记住单个站点的密码。我不会称之为“单一登录”,这是一种使用可信机构在多个网站上进行身份验证的方法,这些网站都依赖该权限来验证用户的身份。

至于你问SSO包已经做到这一点,一些例子是:

+0

所有的网站都不共享一个通用的可信认证机制(当然,如果他们最有可能我不会做任何事情)。我无法控制它们,因为它们是外部系统。我想要做的事情就像浏览器如何识别特定网站的表单并预先填充用户的数据,之后我只需要向用户提交表单(我的想法之一)。你知道一些API或什么可以做到这一点?这是我的目标...... –