2012-11-27 66 views
2

我已被分配到查找在我们的产品中实现SSO的方法。我们有几个Winform应用程序和一个asp.net 4.0 web应用程序(而不是MVC)。单点登录WinForms应用程序和asp.net wep应用程序

所有产品都使用.Net 4.0构建,Web应用程序为ASP.NET 4.0。一些Winforms通过web服务(asmx)与我们的API进行通信,一些则直接使用我们的API。 Web应用程序也使用相同的API。我们提供一组使用相同API的外部客户端的Web服务(asmx)。

目前,我们已经在我们的系统,我们自己的身份认证实施方案(用户名,密码,角色),我们想更换与SSO。或者这两种认证制度可以以某种方式共存? Winforms在Intranet中使用,Web应用程序在Intranet中使用,我们还托管客户端的Web应用程序(可从Internet访问)。

的用户在我们的系统中创建的,但在同一时间,我们用我们自己的工具导入用户从Active Directory。活动目录实际上是主要的用户来源。

我已阅读关于Windows身份基础和我不知道我是否可以使用它来实现SSO。但我不明白的是,如何在Winform应用程序中直接使用API​​时使用WIF。

我想达成什么是从系统中删除所有的用户管理和使用Active Directory作为用户来源。我想这意味着使用ADFS 2.0创建索赔等

我可以使用.Net框架4.5在此实现(我知道,WIF现在在.Net框架4.5中的头等公民)。

你有什么建议如何做到这一点? WIF是在Winforms应用程序和Web应用程序之间实现SSO的最佳选择吗?

回答

6

有一种方法可以从WinForms应用程序中获取WIF身份验证Cookie。

要做到这一点,你就举办WebBrowser控制并将其指向你的Web应用程序的登录页面。假设Web应用程序与ADFS2联合,Web浏览器控件将自动遵循流程 - 它将重定向到ADFS并在那里停止显示用户凭据的提示(在Forms Authentication模式下显示ADFS2),或仅使用NTLM/Kerberos进行身份验证(在Windows身份验证模式下的ADFS2)。然后,Web浏览器将重定向回您的应用程序。

这是你钩住你的代码的地方。您只需向Web浏览器的导航事件添加处理程序,然后在ADFS2.0验证用户身份后,检查它何时返回到您的应用程序。然后,您可以在WinForms应用程序中调用InternetGetCookie方法来获取应用程序发出的所有身份验证Cookie,并且可以关闭托管Web浏览器的窗口。

在这一点上,你必须WIF发布了应用程序的所有身份验证Cookie(在SessionAuthenticationModule)。您现在可以调用您的应用程序Web服务并将Cookie注入http调用。 Web服务器将正确识别用户身份,这意味着您所要做的就是为您的Web服务添加适当的授权(您的Web方法应该执行PrincipalPermission)。

另一种方法是从Web应用程序中公开WCF服务,并使用WS-Federation主动身份验证来保护它们。这种方法的缺点是(在我看来),如果你的身份提供者(ADFS)进一步与另一个不需要实现WS-Trust/WS-Federation的身份提供者联合,那么主动身份验证可能会失败(因为另一个身份提供者身份提供者并没有实现它),而被动场景仍然可以工作(一组重定向会在稍后结束,并且需要用户提供凭证的页面,但连续身份提供者之间的身份验证协议流并不重要)。

+0

非常彻底的答案,Wiktor :)所以没有WebBrowser控件的Winforms没有办法使用WIF?最好的方法可能是重构所有Winform应用程序以使用WCF服务,并让WIF从那里开始工作? – OKB

+0

我不确定活动场景(通过WCF的WIF)是否更好。假设ADFS与另一个自定义STS联合,然后通过Oauth2与Google联合。被动场景会轻松处理(这只是少数重定向问题),但活动场景将失败。在我们的系统中,我们决定采用被动方案,我们在我们的胜利形式应用程序中托管网络浏览器,我们捕获本地身份验证cookie并向cookie提供Web服务代理,以便服务器将胜利表单应用程序识别为已验证身份。它现在工作了2年,没有重大问题。 –