【问题标题】:Sharing Authentication between ASP.NET sites在 ASP.NET 站点之间共享身份验证
【发布时间】:2009-05-28 23:10:10
【问题描述】:

我有两个 ASP.NET 站点(它们不能在同一个进程中运行),我需要在它们之间共享身份验证。如果用户在站点 A 中已经过身份验证,然后转到站点 B,我需要有一种方法与站点 B 共享此信息,这样就不会要求用户再次进行身份验证。两种方式都是如此。您如何分享这些信息?

【问题讨论】:

标签: asp.net


【解决方案1】:

他们在同一个域中吗?

如果你有 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>

另一个好处是,用户可以登录任一站点,并且在访问另一个站点时仍将通过身份验证。

【讨论】:

  • 如果两个站点在不同的服务器上运行,这会起作用吗?身份验证是否在客户端使用 cookie?如果是这样,那么我假设它会查看域是否匹配并允许共享身份验证?即使他们不在同一个域上但您将“domain =”设置为相同,这是否有效?
  • 如果它们在不同的服务器上,它确实有效。是的,它确实使用 cookie。我敢肯定,如果您只是将域设置为相同,即使它们不是,它也不会起作用。
  • 嗯...我尝试将此添加到我的 MVC 应用程序中,但它似乎完全破坏了登录。除了这些配置之外,还有什么需要调整的吗?
【解决方案2】:

选择一个站点作为处理所有登录的“主站点”。我们将一个站点称为 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)。

【讨论】:

  • 不使用同一个域。当用户在站点 A 并且已经通过身份验证,然后移动到站点 B,站点 B 如何知道他们已经通过身份验证?我不希望登录出现两次。
  • @Unknown 当他们移动到站点 B 时,他们没有站点 B 的 cookie,因此站点 B 将创建一个 cookie 并重定向到站点 A 的登录,如上所述;站点 A 也已经有一个 cookie 并且能够识别用户,因此跳过手动登录过程并直接将 UserID 和 uniqueID 发送回 B,然后重定向回 B。
  • @Unknown 唯一的要求是当登录页面加载时,它会检查用户是否已经登录并跳到处理部分而不是显示登录表单。
  • 您的澄清。不过,我确实有一个问题,您如何使 cookie 过期,以便他们在离开网站时下次需要重新登录?我不想留下 cookie 并在以后绕过登录。
  • @unknown 您可以将 cookie 设置为在 20 分钟左右过期,但每次用户访问您的网站时,将其再延长 20 分钟。您可以在站点 B 的每个页面上的某个位置放置站点 A 的隐藏动态图像,并让图像在每次请求时更新 cookie。所以每次对 B 的点击都会更新 A 的 cookie 和 B 的 cookie(假设用户启用了跨域 cookie;大多数都这样做)
【解决方案3】:

如果您使用表单身份验证,您可以通过设置机器密钥来完成此操作。

见:Forms Authentication Across Applications

【讨论】:

    【解决方案4】:

    查看Windows Communication Authentication Service。不会像您想要的那样完全处理单点登录,但它至少应该让人们使用相同的凭据全面登录。

    【讨论】:

    • 这个想法在这种情况下不起作用,因为我需要使用站点 A 中已经存在的登录过程。如果用户直接登录到站点 B,则针对站点 A 运行 Web 服务进行身份验证。真正的问题是当他们已经通过身份验证并更改站点时。
    猜你喜欢
    • 2010-12-20
    • 2016-07-27
    • 2011-11-23
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 2010-12-07
    • 2014-08-10
    相关资源
    最近更新 更多