您需要研究的短语是Single Sign On。如果您需要强大并为大量公共用户提供服务并且您的域具有不同的名称,这并不简单。在封闭的环境中,它变得更容易,因为您不必考虑所有变量,您知道您支持哪些浏览器等。
您可以使用WSFederation、OAuth 提供程序,例如Google或Live,或者您可以实现您的站点都可以访问的共享身份验证服务。但是,有一些限制:您使用两个单独的域的具体要求会让您非常困难。您还可以查看基于声明的身份,这可能会改变您的方法并使您更容易做到这一点。
###更简单的单点登录(共享域或子域)
我也会在这里看看更简单的案例,尽管如果你的问题是从字面上理解的,你可能无法做到这一点。但是,您可以看到您的选择是什么,也许您可以更改您的域名(或至少使用子域)。对于网站:
基本方法是:
在两个 web.config 文件中将用于身份验证的机器密钥设置为相同
如果使用不同的子域:修改您的 FormsAuthentication cookie,以便在您登录后同时用于 site1.domain1.com 和 site2.domain1.com
// after successful login in your login action (and in any other place, such as Register):
HttpCookie authCookie = FormsAuthentication.GetAuthCookie(userName,
authCookie.Domain = "example.com"
Response.AppendCookie(authCookie);
如果您让用户在任一站点而不是主站点登录,请使用共享身份验证数据库
但是请注意,由于浏览器的限制,用于身份验证的共享 cookie 变得越来越困难,这是Jeff Atwood 本人在 Global Network Auto-Login中所写的。在“SO 的新自动登录功能如何工作?”中,对可能的方法进行了全面考虑。. 因此,同样,如果您只需要支持一个封闭的环境(例如您的办公室,或使用一组已知浏览器的一小部分客户),您的生活会更轻松。
共享身份验证令牌和查询字符串
如果您有勇气,并且可以设置共享数据库或服务,这也是可能的。
当用户在 site1.com 上成功登录时,您可以在数据库中为该登录设置一个一次性令牌,并将该令牌的详细信息放入 cookie。当它们被传递到站点 2 时,您可以在查询字符串中传递该一次性令牌,然后在站点 2 中,您可以检查它们传递的令牌是否有效。如果是,那么您可以让他们登录并设置他们的登录 cookie。您需要注意这一点,在查询字符串中传递本质上是身份的内容时需要考虑安全性。
脚注
有一本很棒的基于声明的身份验证的在线 MS 书籍,名为“基于声明的身份和访问控制指南”(注意:pdf 链接),我已将其添加为脚注,以防链接失效。