我被指派在我们的产品中找到一种实现SSO的方法。我们有几个Winform应用程序和一个asp.net 4.0 web应用程序(不是MVC)。
所有产品都是使用.Net 4.0构建的,web应用程序是ASP.Net 4.0。一些Winforms通过web服务(asmx)与我们的API通信,一些则直接使用我们的API。网络应用程序也使用相同的API。我们为外部客户端提供一组使用相同API的web服务(asmx)。
目前,我们的系统中有自己的身份验证实现(用户、密码、角色),我们希望用SSO取代它。或者这两种身份验证机制可以以某种方式共存吗?Winforms用于内部网,web应用程序同时用于内部网。我们还为客户端托管web应用程序(可从Internet访问)。
用户是在我们的系统中创建的,但同时我们使用自己的工具从Active Directory导入用户。Active Directory实际上是主要的用户来源。
我读过关于Windows Identity Foundation的文章,我想知道是否可以使用它来实现SSO。但我不明白的是,当winform应用程序直接使用API时,如何在它们中使用WIF。
我想实现的是从我们的系统中删除所有用户管理,并使用Active Directory作为用户源。我想这意味着使用ADFS2.0来创建索赔等
我可以在这个实现中使用.Net Framework 4.5(我知道WIF现在是.Net Framework 4.5中的一等公民)
你对此有什么建议吗?WIF是跨winforms应用程序和web应用程序实现SSO的最佳替代方案吗?
有一种方法可以从WinForms应用程序中获取WIF身份验证cookie。
为此,只需托管WebBrowser
控件并将其指向web应用程序的登录页。假设web应用程序与ADFS2联合,则web浏览器控件将自动遵循流程-它将重定向到ADFS并在那里停止,以显示用户凭据提示(表单身份验证模式中的ADFS2)或仅使用NTLM/Kerberos进行身份验证(Windows身份验证模式下的ADFS1)。然后,web浏览器将重定向回您的应用程序。
这是挂接代码的地方。您只需向web浏览器的导航事件添加一个处理程序,并在ADFS2.0验证用户后检查它何时返回应用程序。然后,您可以调用WinForms应用程序中的InternetGetCookie
方法来获取应用程序发布的所有身份验证cookie,并可以关闭承载web浏览器的窗口。
此时,您已经拥有WIF(SessionAuthenticationModule
)为您的应用程序发布的所有身份验证cookie。现在,您可以调用应用程序web服务,并将cookie注入http调用中。web服务器将正确地将用户识别为已通过身份验证,这意味着您所要做的就是为您的web服务添加适当的授权(web方法上的PrincipalPermission
应该这样做)。
另一种方法是从web应用程序中公开WCF服务,并使用WS-Federation活动身份验证来保护它们。这种方法的缺点是(在我看来),如果您的身份提供者(ADFS)与另一个不一定实现WS-Trust/WS-Federation的身份提供者进一步联合,那么主动身份验证可能会失败(因为另一个身份提供者没有实现它),而被动场景仍然有效(一堆重定向迟早会以一个要求用户提供凭据的页面结束,但连续身份提供者之间的身份验证协议流无关紧要)。