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

Nei*_*sey 7 c# asp.net-mvc forms-authentication

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

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

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

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

jbl*_*jbl 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.commydomain.com),并可用作打开会话的令牌。因此,请务必控制整个 *.myDomain.com 子域并使其为 httpOnly 且安全 (https)

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

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. 设置 cookie 域为 .myDomain.com
  4. 当用户输入b.myDomain.com时,检查cookie服务器端(在java中)是否存在userId和散列值之间的匹配
  5. 如果 cookie 正确,则为用户 userId 打开会话

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