7

我目前正在为上述问题寻找一个很好的解决方案。我们可能会在 .NET 上运行表单身份验证。

我有一个 ASP.NET MVC 应用程序运行在a.mydomain.com和一个基于 Java 的应用程序运行在b.mydomain.com.

什么是最好的方法,这样我就不必登录每个应用程序。说,当我登录a.mydomain.com然后打开 Javab.mydomain.com时,它会检查并看到我已经登录了吗?

WCF AuthenticationService 类会为此工作吗?我可以从 JavaScript 发出 AJAX 请求b.mydomain.com来检查我是否已经在 .NET 应用程序中登录吗?

4

3 回答 3

2

只要mydomain.com不在公共后缀列表(http://publicsuffix.org/list/)中,a.mydomain.com就可以放一个域cookie.mydomain.com

(注意放cookie只能降一级:a.b.mydomain.com不能放.mydomain.comcookie)

cookie 将被发送到b.mydomain.com(以及*.mydomain.comand mydomain.com) 并且可以用作打开会话的令牌。所以一定要控制整个 *.myDomain.com 子域并使其 httpOnly 和安全 (https)

Response.SetCookie(new HttpCookie("myCookieName", "myCookieValue") { HttpOnly = true, Domain = ".myDomain.com", Secure=true });

Atlassian Crowd 解决方案http://www.atlassian.com/software/crowd/overview的某些部分基于这种 cookie 机制

所以你可能:

  1. 在 a.domain.com 上启用表单身份验证
  2. 成功登录后构建一个myTokencookie,其值包含 userId 和散列 userId,散列键由 a.myDomain.com 和 b.myDomain.com 已知
  3. 使用域 .myDomain.com 设置 cookie
  4. 当用户进入 b.myDomain.com 时,检查 cookie 服务器端(在 java 中)是否匹配 userId 和散列值
  5. 如果 cookie 正确,则为用户 userId 打开会话

请注意,您将无法访问 cookie 客户端(因此没有 js cookie 处理,除非它是服务器端 js,例如 nodejs)

于 2013-01-24T17:13:57.960 回答
1

使用 Java 或 .NET 现有解决方案不太可能在其他平台上运行。你需要几个能力:

  1. 使用识别标识符(会话、cookie)跟踪客户端。
  2. 让 Java 和 .NET 应用程序都能获得相关信息。

你怎么能做到这些?

  1. 这实际上很容易。您使用的是同一个域,因此您可以在浏览器上为所有域放置一个 cookie,这意味着对 a* 和 b* 的请求都会将 cookie 发送到服务器。Java 和 .NET 都具有出色的 cookie 放置功能。
  2. 这取决于您的后端。用于持久存储的系统是什么?如果您有两个系统都连接到的 MySQL 数据库之类的东西,您可以为每个存储的标识符创建一个包含登录信息的表以进行身份​​验证。如果您采用这条路线,也可以设置某种超时来使旧的身份验证无效。

如果您拥有这两条信息,则可以在每个系统上进行身份验证。

于 2013-01-24T17:02:49.090 回答
1

我建议使用企业 sso 协议之一,Oauth2 或 ws-federation。这为您在组合服务时提供了最大的灵活性,您不仅可以联合这两者,而且以后可以轻松地扩展您的应用程序环境。两种协议都不需要应用程序位于同一域中。

尽管这对于您的简单需求来说可能听起来过于复杂,但您只需执行一次,就可以永远解决 sso 问题,无论您的应用程序将来会发生什么。

于 2013-01-24T17:25:23.290 回答