2009-08-07 41 views
12

我正在为一系列将共享用户帐户信息的站点共同制定计划。这个想法是,一旦用户使用他们的OpenID登录,他们可以访问任何网站,并知道他们是谁。使用OpenID的ASP.NET MVC多站点SSO

我可以采用哪些常见模式/最佳实践来达到此目的?

+0

我想我有类似的问题。你能描述你是如何实现它的吗? – 2010-09-12 13:34:12

回答

12

如果所有网站在其URL中共享一个通用主机名,那么您可以设置一个auth cookie(FormsAuthentication.SetAuthCookie),指定cookie的路径为“/”,以便所有网站都可以看到用户登录。

如果这些网站没有共享一个通用主机名,我认为唯一能够真正“一旦登录,在任何地方登录(在您的网站环境中)”的唯一方法就是在所有身份验证发生时一个站点(可能是专门用于验证用户的站点)以及其他站点将用户重定向到该站点以进行身份​​验证,然后该站点将重定向回。实质上,该认证站点成为身份提供者,几乎完全满足OpenID提供者的角色(事实上DotNetOpenAuth可用于此目的)。由于听起来您的目标是让用户使用其OpenID登录,因此您的OpenID提供程序可以使用OpenID对该用户进行身份验证。您可以编写自己的纯代理OpenID提供程序,只要授权请求中的领域是您信任的网站之一,它就会立即响应checkid_immediate请求。因此,您可以在所有网站中实现单点登录。

+0

重新设置全局身份验证Cookie:是否不会导致漏洞?我忘记了这种攻击被称为什么,但这是authcookie被盗的时候。或者我误认这是不安全的? 还有一件事 - 是新的堆栈交换站点如何做到这一点(登录主界面后,您将自动登录到它的meta)? – 2010-07-10 07:18:44

+0

这不是一个全球性的cookie。它只与单个互联网主机一样宽,因为大多数Cookie都是。如果您控制或信任该主机上的所有网站,则只需执行此操作。 如果所有* .stackexchange.com站点共享一个用户的登录名,那么这个cookie可能是域名范围的。 – 2010-07-11 13:04:35

1

请从微软考虑以下方式对Web服务安全&做法:

经纪人的身份验证 - http://msdn.microsoft.com/en-us/library/aa480560.aspx

主要议题是 - Web服务安全

场景,模式,和实施指南Web Services Enhancements(WSE)3.0

http://msdn.microsoft.com/en-us/library/aa480545.aspx

最终你可以做很多事情。我通过使用指向另一个域的一个网站的令牌构建了一个URL,从而实现了简单的单点登录。加密的令牌编码包含要返回到以前的域的详细信息。在第二个域上接收到传入请求后,基础Web服务将使用两个域都知道的共享私有密钥来检查传入请求的令牌对前一个域是否有效。