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

例如:

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

即使登录是在子域中进行的,我是否可以向报告站点验证它们的身份?

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

有帮助吗?

解决方案

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

将auth cookie正确设置为父域后,所有子域都应该能够读取它。

其他提示

当您对用户进行身份验证时,将身份验证cookie的域设置为二级域,即家长.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));

作为旁注,我发现使用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);
            }

除了将cookie设置为父域之外,还需要确保所有站点(apps)具有相同的validationKey和decryptionKey(),以便它们都能识别彼此的身份验证票证和cookie。这里非常好的文章 http://www.codeproject.com/KB/aspnet/SingleSignon.aspx

是的,当然。你可能需要在某些阶段自己动手,但它应该是可行的。

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

Jro的回答很好。但请确保更新webconfig forms authentication setting" domain" ,否则表单身份验证注销将无法正常工作。 这里是我提出的退出问题跨越。这里的伎俩是'。'作为域的前缀被设置为cookie为“.parent.com” (使用cookie检查员)。

<authentication mode="Forms">          
      <forms cookieless="UseCookies" defaultUrl="~/Default" loginUrl="~/user/signin" domain=".parent.com"  name="FormAuthentication" path="/"/>
    </authentication>

要做的两件事:

  1. MachineKey在所有web.config(主域和子域)
  2. 中应该相同
  3. AuthenticationCookie域名应该相同。
  4. 按照关注文章更深入。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top