【问题标题】:Asp.net forms authentication and multiple domainsAsp.net 表单身份验证和多个域
【发布时间】:2010-01-13 12:51:03
【问题描述】:

我有两个域,domain1.com 和 domain2.com 指向同一个 asp.net 网站,该网站使用 asp.net 构建表单身份验证。问题是即使域指向同一个网站,用户一次也只能获得一个域的身份验证。因此,如果他先使用 www.domain1.com,然后访问 www.domain2.com,则后面的网站是同一个网站,但他只对 www.domain1.com 进行了身份验证。如果他在访问网站时使用 www 而不是 www,也会发生同样的事情。

这是我用来登录的:

FormsAuthentication.RedirectFromLoginPage(username, cookie.Checked);

检查登录:

User.Identity.IsAuthenticated

如何使用户获得指向同一网站的所有域的身份验证?

【问题讨论】:

  • 身份验证cookie和大多数cookie一样,是按域存储的,避免跨域轮询和冒充。你为什么要这样做?
  • 因为有时您希望用户能够无缝使用多个站点,而不必分别登录每个站点。
  • 为什么不遵循 StackOverflow 方法并使用 OpenID 等外部身份验证提供程序。
  • 即使您使用 OpenID,您仍然需要一种机制将票证转移到第二个域 - 当 SO 使用 UserVoice.com 进行错误/问题跟踪时,我仍然必须登录即使我在两个站点上使用相同的 OpenID 提供程序...

标签: asp.net forms-authentication


【解决方案1】:

您所追求的是单点登录解决方案。

由于 ASP.NET 身份验证的核心通常基于 cookie,因此需要注意两点:

  1. 正确设置您的 cookie。
  2. 在注册期间将您的用户退回到备用域。

更深入地研究这两个:

1.正确设置 cookie

您需要确保 ASP.NET 将身份验证票证 cookie 写入根域,而不是显式域,这是使用表单元素的 domain 属性完成的:

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

您应该将您的域设置为“.example.com” - 请注意前导句点 - 这是关键。这样对 example.com 和 www.example.com 的请求都将正确读取 cookie,并对用户进行身份验证。

2。将用户退回到备用域

我们在一些使用单点登录的网站上实施的是往返登录过程。用户在第一个域上进行身份验证,我们对登录详细信息进行加密,并将其重定向到第二个域上的已知页面,在那里登录,然后重定向回原始服务器。

这种客户端重定向很重要 - 只有当客户端有响应时才会写入 cookie,并且浏览器必须访问第二个域才能真正看到 cookie。

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

  1. 您可能希望对加密的登录详细信息设置超时 - 这样从浏览器历史记录中调用该 URL 不会自动让用户登录。
  2. 如果域位于不同的服务器上,则需要确保机器密钥配置相同,以便正确加密和解​​密详细信息,或使用其他共享密钥。
  3. 您可能希望建立一种机制来从原始服务器中撤回用户 ReturnUrl,以便您可以将他们发送回正确的位置。

你也可以看看"Forms Authentication Across Applications"

【讨论】:

  • 我知道这个问题很老,但我正在为类似的情况而苦苦挣扎。我正在创建一个移动站点,我需要它与主站点(现有站点)共享身份验证。我按照您最后链接的文章中的建议进行操作,但仍然没有运气。我尝试添加domain=".example.com" 属性(替换为主站点的域),但现在身份验证似乎根本不起作用。 (注销没有任何作用,我什至清除了浏览器的 cookie。)如果您能花一些时间帮助我,我会考虑支付合理的咨询费。
  • 第 2 步听起来有点可疑...加密登录详细信息并将其重定向到第二个域上的已知页面...嗯...黑客可能会拦截您服务器之间的加密数据和客户端,然后使用该加密数据从第二个域登录受害者的帐户。他们甚至不必解密数据。他们只会使用您的客户端 javascript 代码并将加密数据注入您自己的系统,然后对其进行破坏。即使你让加密数据在几毫秒内过期,黑客也可能比被重定向的用户更快。
  • 嗨,马克 - 确实 - 理想情况下,所有这些都应该通过 SSL - 这应该可以缓解大多数问题 - 实际上,加密数据的生存时间必须超过毫秒,因为我们正在谈论网络流量和延迟。不确定 JavaScript 假设来自哪里(我本可以更具体)我们发出 302 重定向作为响应,这将使浏览器向链中的下一个服务器发出适当的请求 - 但是如果我没记错的话仍然依赖于查询字符串——因此使用了 SSL。然后我们更多地局限于 SSL 妥协。
  • @JonathanWood domain 属性中不应包含句点(句号)。将其设置为domain="example.com",它应该可以工作。
  • @hynsey 这取决于您托管网站的方式。如果它在www.example.com 上设置没有句点的cookie 域将不匹配您的主机并且cookie 将被拒绝,在这种情况下,您应该将其设置为www.example.com 或只是.example.com 以匹配所有子域。
【解决方案2】:

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

【讨论】:

  • 我不确定这将如何解决跨域身份验证?
  • 它在 URL 中发送身份验证票而不是 cookie(仅限于单个域)。
  • @Darin 但 URL 中的令牌仍然为身份验证服务器唯一编码,不是吗?
  • 是的,但是根据 OP,它是同一个 ASP.NET 应用程序和同一个服务器(即相同的机器密钥),它只是一个域重定向,所以这将起作用。
【解决方案3】:

您应该阅读 MSDN 上的 Explained: Forms Authentication。它们涵盖了跨域身份验证。

【讨论】:

  • @Filip,该文档中的哪个位置提到了跨域身份验证?我浏览了文档,除了似乎排除跨域身份验证的点之外找不到任何信息。有一篇文章的链接讨论了跨多个 AD 域的身份验证,这显然是一个不同的问题空间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-17
  • 2011-01-22
相关资源
最近更新 更多