4

如何在跨域 MVC4 Web 应用程序中实现单点登录 (SSO)

4

2 回答 2

13

domain通过将表单身份验证 cookie 的属性设置为根域并为两个应用程序配置相同的机器密钥,可以轻松实现相同的域 SSO 。

跨域 SSO 更具挑战性。有不同的技术来实现它。例如 StackExchange 使用 HTML5 本地存储。它们的机制在 中进行了描述this blog post

以下是一些基本步骤:

  1. 设置主域供用户登录。例如 logon.com
  2. 当未经身份验证的用户尝试访问 2 个应用程序中的一些应用程序上的受保护资源时,他将被重定向到登录域进行身份验证。
  3. 用户进行身份验证,登录域生成一个会话标识符,其中包含登录用户的用户名。此会话 id 使用对称算法加密,并在 3 个域之间共享秘密。登录域还设置了一个表单身份验证 cookie,以指示用户已经在那里进行了身份验证。
  4. 登录域重定向回传递会话标识符的受保护资源。
  5. 持有受保护资源的应用程序解密会话 id 以提取用户名并在其域上设置表单身份验证 cookie。
  6. 用户请求第二个域上的受保护资源。
  7. 由于他尚未通过身份验证,他被重定向到登录域。
  8. 用户已在登录域上通过身份验证,并且使用相同技术生成会话标识符并传回
  9. 第二个域解密会话标识符以提取用户名并为第二个域发出表单身份验证cookie。

作为将用户名加密到会话标识符中的替代方法,登录域可以将此信息简单地存储到共享(在 3 个域之间)数据存储中,并且会话标识符将只是此记录的标识符,以便其他域可以检索此共享数据存储中的用户名。

于 2013-02-28T06:41:45.347 回答
1

最后,我能够实施。以下是我已经完成的步骤

  • 登录 App1
  • 获取使用 App2 登录的选项
  • 点击“使用 App2 登录”</li>
  • 重定向到 App2 的登录屏幕
  • 单击重定向到 SSOInMVCWcfService 的 App2 的登录按钮。这里Login方法调用App1的服务即SSOAuthService的方法Authenticate。如果经过身份验证,则为该用户名生成令牌,并从 App1 的服务中检索用户 ID。
  • 一旦为这个经过身份验证的用户生成令牌并检索到用户 ID,这些值就会输入到数据库中的表中,比如“SessionDetails”。
  • 然后将当前用户的 userid 和 token 发送到 App2。
  • 现在 App2 通过将这些值添加为响应对象中的 cookie 将返回 URL (即 app1 的经过身份验证的页面 url)连同用户 ID 和令牌一起发送到 App1 的登录页面。
  • 现在在 App1 登录页面上,检索这些 cookie,并根据用户 ID 从“SessionDetails”表中检索当前用户名。
于 2013-03-13T11:15:08.643 回答