26

当身份验证发生在子域而不是父域时,是否可以跨子域对用户进行身份验证?

例如:

用户登录到site1.parent.com,然后我们需要将他们发送到reporting.parent.com。

即使登录发生在子域中,我是否可以向报告站点验证它们?

到目前为止,我所做的所有研究都是让用户先登录到父域,然后每个子域都可以访问身份验证 cookie。

4

7 回答 7

30

在对用户进行认证时,将认证cookie的域设置为二级域,即parent.com。每个子域都会根据请求接收父域的 cookie,因此可以对每个子域进行身份验证,因为您将有一个共享的身份验证 cookie 可供使用。

验证码:

System.Web.HttpCookie authcookie = System.Web.Security.FormsAuthentication.GetAuthCookie(UserName, False);
authcookie.Domain = "parent.com";
HttpResponse.AppendCookie(authcookie);
HttpResponse.Redirect(System.Web.Security.FormsAuthentication.GetRedirectUrl(UserName, 
                                                                       False));
于 2009-03-03T21:06:22.137 回答
10

您可以在身份验证时将 cookie 设置为父域,但您必须明确设置它,它将默认为您所在的完整域。

一旦 auth cookie 正确设置为父域,那么所有子域都应该能够读取它。

于 2009-03-03T21:02:55.030 回答
7

附带说明一下,我发现在使用 jro 的方法效果很好 +1 后,FormsAuthenication.SignOut() 方法在从 www/ 以外的子域调用时不起作用。(我猜是因为 .Domain 属性不匹配) - 为了解决这个问题,我使用了:

if (Request.Cookies[FormsAuthentication.FormsCookieName] != null)
            {
                HttpCookie myCookie = new HttpCookie(FormsAuthentication.FormsCookieName);
                myCookie.Domain = "parent.com";
                myCookie.Expires = DateTime.Now.AddDays(-1d);
                Response.Cookies.Add(myCookie);
            }
于 2010-07-02T09:55:08.350 回答
7

除了给父域设置一个cookie外,还需要确保所有站点(应用程序)具有相同的validationKey和decryptionKey(),以便它们都能识别彼此的身份验证票和cookie。很好的文章在这里http://www.codeproject.com/KB/aspnet/SingleSignon.aspx

于 2011-06-24T04:37:16.790 回答
5

Jro 的回答很好。但请务必更新 webconfig forms authentication setting "domain" ,否则 forms authentication signout 将无法正常工作。是我遇到的注销问题。这里的诀窍是有一个'。作为域的前缀为 cookie 设置为“.parent.com”(使用 cookie 检查器)。

<authentication mode="Forms">          
      <forms cookieless="UseCookies" defaultUrl="~/Default" loginUrl="~/user/signin" domain=".parent.com"  name="FormAuthentication" path="/"/>
    </authentication>
于 2015-06-19T09:05:18.290 回答
4

是的,当然。您可能需要在某些阶段自行推出,但这应该是可行的。

一个想法:当你将他们重定向到边界时,给他们一个一次性的通行证,然后告诉接收子域期待他们(这个用户,来自这个 IP,有这个令牌)。

于 2009-03-03T20:57:52.453 回答
3

要做的2件事:

  1. 所有 web.config 中的 MachineKey 应该相同(主域和子域)
  2. AuthenticationCookie 域名应该相同。

请按照以下文章进行更深入的了解。

于 2012-10-03T03:07:39.683 回答