单点登录,有2个子域,一个Java,一个.NET

时间:2013-01-24 16:55:41

标签: c# asp.net-mvc forms-authentication

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

我在a.mydomain.com上运行了一个ASP.NET MVC应用程序,并在b.mydomain.com上运行了一个基于Java的应用程序。

最佳方法是什么,以便我不必登录每个应用。比如,当我登录a.mydomain.com然后打开Java b.mydomain.com时,它会检查并看到我已登录?

WCF AuthenticationService类是否适用于此?我可以从b.mydomain.com的JavaScript做一个AJAX请求来检查我是否已经在.NET应用程序中登录了吗?

3 个答案:

答案 0 :(得分:2)

只要mydomain.com不在公开后缀列表(http://publicsuffix.org/list/)中,a.mydomain.com就可以为.mydomain.com

设置域Cookie

(请注意,您只能在放置Cookie时降低一级:a.b.mydomain.com无法放置.mydomain.com Cookie

Cookie将发送到b.mydomain.com(以及*.mydomain.commydomain.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. 成功登录后,构建一个myToken cookie,其中包含userId和散列的userId,其中包含a.myDomain.com和b.myDomain.com已知的散列密钥
  3. 使用域.myDomain.com
  4. 设置Cookie
  5. 当用户进入b.myDomain.com时,检查cookie服务器端(在java中)是否匹配userId和散列值
  6. 如果cookie正确,请打开用户userId的会话
  7. 请注意,您将无法访问cookie客户端(因此没有js cookie处理,除非它是服务器端js,例如nodejs)

答案 1 :(得分:1)

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

  1. 使用识别标识符(会话,cookie)跟踪客户端。
  2. 让Java和.NET应用程序都能够获取相关信息。
  3. 你怎么能这样做?

    1. 这实际上非常简单。您正在使用相同的域,因此您可以在浏览器上为所有域放置cookie,这意味着对*和b *的请求都会将cookie发送到服务器。 Java和.NET都具有出色的cookie放置功能。<​​/ li>
    2. 这取决于您的后端。用于持久存储的系统有哪些?如果你有两个系统连接的MySQL数据库,你可以为每个存储的标识符创建一个包含登录信息的表进行身份验证。如果您采用这种方式,也可以使某些时间超时以使旧的身份验证无效。
    3. 如果您同时拥有这两条信息,则可以在每个系统上进行身份验证。

答案 2 :(得分:1)

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

虽然这对于您的简单需求来说听起来过于复杂,但无论将来您的应用程序发生什么,您都可以一次性解决sso问题。