单点登录WinForms应用程序和asp.net wep应用程序

单点登录WinForms应用程序和asp.net wep应用程序,asp.net,winforms,authentication,single-sign-on,wif,Asp.net,Winforms,Authentication,Single Sign On,Wif,我被指派寻找一种在我们的产品中实现SSO的方法。我们有几个Winform应用程序和一个asp.NET4.0Web应用程序(不是MVC) 所有产品都是使用.Net 4.0构建的,web应用程序是ASP.Net 4.0。 有些Winforms通过web服务(asmx)与我们的API通信,有些直接使用我们的API。web应用程序也使用相同的API。我们提供了一组web服务(asmx),它们对外部客户端使用相同的API 目前,我们的系统中有自己的身份验证实现(用户、密码、角色),我们希望用SSO来取代它

我被指派寻找一种在我们的产品中实现SSO的方法。我们有几个Winform应用程序和一个asp.NET4.0Web应用程序(不是MVC)

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

目前,我们的系统中有自己的身份验证实现(用户、密码、角色),我们希望用SSO来取代它。或者,这两种身份验证机制能否以某种方式共存?Winforms用于内部网,web应用程序用于内部网,我们还为客户端托管web应用程序(可从Internet访问)

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

我已经阅读了Windows身份基础,我想知道我是否可以用它来实现SSO。但我不明白的是,当winform应用程序直接使用API时,如何在其中使用WIF

我希望实现的是从系统中删除所有用户管理,并使用Active Directory作为用户源。我想这意味着使用ADFS2.0来创建声明,等等

我可以在这个实现中使用.NETFramework4.5(我知道WIF现在是.NETFramework4.5中的一等公民)


你对此有什么建议吗?WIF是跨winforms应用程序和web应用程序实现SSO的最佳替代方案吗?

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

为此,您只需托管
WebBrowser
控件并将其指向web应用程序的登录页面。假设web应用程序与ADFS2联合,web浏览器控件将自动遵循流程-它将重定向到ADFS并在那里停止以显示用户凭据提示(表单身份验证模式下的ADFS2)或仅使用NTLM/Kerberos进行身份验证(Windows身份验证模式下的ADFS2)。然后,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的身份提供程序进一步联合,那么活动身份验证可能会失败(因为另一个身份提供程序没有实现它)虽然被动方案仍然有效(一系列重定向很快会结束,但页面要求用户提供凭据,但连续身份提供者之间的身份验证协议流并不重要)。

非常彻底的回答,Wiktor:)那么没有WebBrowser控件就无法在Winforms中使用WIF?最好的方法可能是重构所有Winform应用程序以使用WCF服务,并让WIF从那里开始工作?我不确定活动场景(WIF优于WCF)是否更好。假设ADFS与另一个定制STS联合,然后通过Oauth2与Google联合。被动场景将很容易处理这个问题(这只是几个重定向的问题),但主动场景将失败。在我们的系统中,我们决定使用被动场景,我们在win forms应用程序中托管web浏览器,捕获本地身份验证cookie并向web服务代理提供cookie,以便服务器将win forms应用程序识别为已验证。它已经运行了2年,没有重大问题。