我们正在创建一个应用程序,希望它能够让用户通过多种方式进行身份验证。无论是基于云的服务(谷歌、Facebook 等)或者——希望——通过他们自己公司的 Active Directory。
是否有一个合理简单的方法来做到这一点,同时又不超出客户愿意付出的努力来实现这一点?
答案1
从高层次上讲,您可能需要花一些时间思考如何在应用程序上构建身份层。如何抽象所有不同的身份验证提供程序。一种方法是利用基于声明的身份方法。您无需将所有身份验证/授权逻辑嵌入到应用程序上,而是拥有这一层,您可以在其中将来自身份验证提供程序的用户属性转换为它们之间的通用表示。这称为“基于声明的身份”
您可以从 Microsoft 下载一本免费的书来了解这种方法基于声明的身份和访问控制指南(第二版)。
更具体地说,实现方式将根据您使用的平台/语言以及可用的库而有所不同。如果您想与社交身份提供商集成,通常使用的协议是 OAuth2(Google、Facebook、LiveID)或 OAuth1.0a(Twitter)。在 NET 中,您有以下库DotNetOpenAuth这将实现这些协议。如果您想要与 ADFS(Active Directory 联合身份验证服务)之类的东西集成,则使用的协议是带有 SAML 令牌的 WS-Federation 或 SAML 2.0 协议。在 NET 中,选择的库是 Windows Identity Foundation (WIF)。在同一个应用程序中混合两者并不容易。这就是我所说的投资于一个通用抽象层。
最后,云服务可能会有所帮助。这些是您的应用程序和身份提供商之间的代理。从应用程序的角度来看,您可以实现一个库:
Windows Azure 访问控制服务 (ACS):作为参考,这里有一个将 ASP.NET 与 ACS 集成的教程http://www.windowsazure.com/en-us/develop/net/how-to-guides/access-control
Auth0:作为参考,这里有一个将 ASP.NET 与 Auth0 集成的教程https://docs.auth0.com/aspnet-tutorial(免责声明:我在 Auth0 工作)
答案2
我们有几个基于第三方云的系统需要访问我们的 Active Directory 才能提供单点登录。
对于这两者,我们只需设置一个由 IP 地址锁定的防火墙发布规则,以便只有特定服务器可以通过互联网连接到我们的域控制器。它也仅适用于加密流量。
根据你使用的防火墙,配置会有所不同,因此如果你更新问题的详细信息,你可能会得到更具体的答案
答案3
Microsoft 使用基于 Forefront Identity Manager 和 ADFS 的“DirSync”工具来处理此问题,以便在本地目录和云目录之间实现单点登录。这就是他们为 Office 365、Intune 和 Lync Online 获得 SSO 的方式。
您很可能需要实施类似的措施,或者说服客户向您的特定服务开放防火墙,并直接针对他们的 AD 执行 LDAPS 或其他操作。