【发布时间】:2009-05-28 23:10:10
【问题描述】:
我有两个 ASP.NET 站点(它们不能在同一个进程中运行),我需要在它们之间共享身份验证。如果用户在站点 A 中已经过身份验证,然后转到站点 B,我需要有一种方法与站点 B 共享此信息,这样就不会要求用户再次进行身份验证。两种方式都是如此。您如何分享这些信息?
【问题讨论】:
标签: asp.net
我有两个 ASP.NET 站点(它们不能在同一个进程中运行),我需要在它们之间共享身份验证。如果用户在站点 A 中已经过身份验证,然后转到站点 B,我需要有一种方法与站点 B 共享此信息,这样就不会要求用户再次进行身份验证。两种方式都是如此。您如何分享这些信息?
【问题讨论】:
标签: asp.net
他们在同一个域中吗?
如果你有 app1.blah.com 和 app2.blah.com,这很容易做到。只需在 web.config 的 forms-section 中将域和名称设置为相同的值即可:
<authentication mode="Forms">
<forms loginUrl="login.aspx"
name=".COOKIENAME"
protection="All"
path="/"
domain="blah.com"
timeout="30" />
</authentication>
另一个好处是,用户可以登录任一站点,并且在访问另一个站点时仍将通过身份验证。
【讨论】:
选择一个站点作为处理所有登录的“主站点”。我们将一个站点称为 A,将非登录站点称为 B。
当用户在 A 上使用登录表单时,它应该设置一个带有一些唯一标识符的 cookie,例如 GUID。只要该 cookie 有效,用户就应该保持登录状态。
当用户访问站点 B 时,站点 B 应该使用自己的唯一标识符(另一个 GUID)设置一个 cookie,然后重定向到站点 A 上的登录,并在查询字符串中传递唯一 ID:Response.Redirect("http://siteA.com/login.aspx?id=ABCDEF")
当用户在 A 上的表单上登录时,我们应该使用用户 ID 和传递的唯一 ID 更新站点 B 的数据库 - 可能通过 Web 服务 - 基本上让站点 B 知道“当用户使用 ABCDEF在他们的 cookie 中点击您的网站,它实际上是 User387"。
然后重定向回站点 B。之前的 cookie 仍然设置,但站点 B 现在读取该 cookie 并找到相应的用户 ID,因此它知道用户是谁并允许访问。
当用户到达站点 A 时,如果他们之前已经登录到站点 A,它将识别他们的 cookie,按照上述相同的步骤,并立即重定向。
这是每个单点登录服务所做的非常简单的版本。用户只会被发送到 A 的登录页面一次,无论他们从哪里开始(站点 A 或站点 B)。
【讨论】:
如果您使用表单身份验证,您可以通过设置机器密钥来完成此操作。
【讨论】:
查看Windows Communication Authentication Service。不会像您想要的那样完全处理单点登录,但它至少应该让人们使用相同的凭据全面登录。
【讨论】: