Asp.netformsauthentication和多个域

我有两个域,domain1.com和domain2.com指向同一个asp.net网站,它使用窗体身份validation的asp.net生成。 问题是,即使域指向同一个网站,用户一次只能得到一个域的authentication。 所以,如果他先使用www.domain1.com,然后访问www.domain2.com这是在后面的同一个网站,但他只能通过www.domain1.com进行身份validation。 如果他在访问网站时使用www而不是www,也会发生同样的情况。

这是我用来login:

FormsAuthentication.RedirectFromLoginPage(username, cookie.Checked); 

要检查login:

 User.Identity.IsAuthenticated 

我如何才能让用户获得所有指向同一网站的域的身份validation?

您所追求的是单点login解决scheme。

由于ASP.NET身份validation的核心一般都是基于cookie的,所以有两点需要注意:

  1. 正确设置你的cookies。
  2. 在注册期间将您的用户popup到备用域。

更深入地看待这两者:

1.正确设置cookie

您需要确保ASP.NET正在将身份validation票据cookie写入根域,而不是使用forms元素的domain属性来完成显式域:

 <forms name="name" loginUrl="URL" defaultUrl="URL" domain=".example.com"> </forms> 

你应该把你的域名设置为“.example.com” – 注意领先期 – 这是关键。 这样,对example.com和www.example.com的请求都会正确读取cookie,并对用户进行身份validation。

2.反弹用户到替代域名

我们在几个使用单一login的网站上实施的是往返login程序。 用户在第一个域上进行身份validation,我们对login信息进行encryption,并将其redirect到第二个域上的已知页面,将它们logging在那里,然后redirect回原始服务器。

这种客户端redirect很重要 – 只有在客户端有回应时才会写入cookie,浏览器必须访问第二个域才能看到cookie。

在这种设置中要考虑的其他细节:

  1. 您可能希望在encryption的login详细信息上有一个超时时间,以便从浏览器历史logging中调出该URL不会自动login该用户。
  2. 如果这些域位于不同的服务器上,则需要确保这两个机器密钥的configuration是相同的,以便您可以正确地encryption和解密这些详细信息,或者使用其他一些共享密钥。
  3. 您可能希望有一个机制来调用原始服务器上的用户ReturnUrl,以便您可以将它们发送回正确的位置。

您还可以查看“跨应用程序的表单身份validation”

你可以尝试设置cookieless="true"

您应该阅读MSDN上的解释:表单身份validation 。 它们涵盖了跨域身份validation。