C# 表单跨子域的身份验证

C# 表单跨子域的身份验证,c#,asp.net,forms-authentication,C#,Asp.net,Forms Authentication,当身份验证发生在子域而不是父域时,是否可以跨子域对用户进行身份验证 例如: 用户登录site1.parent.com,然后我们需要将其发送到reporting.parent.com 即使登录发生在子域中,我是否可以将其验证到报告站点 到目前为止,我所做的所有研究都是让用户先登录父域,然后每个子域都可以访问身份验证cookie 是的,当然。您可能需要在某些阶段推出自己的产品,但这应该是可行的 一个想法是:当您跨边界重定向它们时,给它们一个一次性通行令牌,然后告诉接收子域期望它们(此用户,来自此IP

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

例如:

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

即使登录发生在子域中,我是否可以将其验证到报告站点


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

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


一个想法是:当您跨边界重定向它们时,给它们一个一次性通行令牌,然后告诉接收子域期望它们(此用户,来自此IP,使用此令牌)。

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


一旦验证cookie正确设置为父域,则所有子域都应该能够读取它。

对用户进行身份验证时,请将验证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));

顺便说一句,我发现在使用jro的方法+1之后,FormsAuthentication.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外,还需要确保所有站点(应用程序)具有相同的validationKey和decryptionKey(),以便它们都能识别彼此的身份验证票证和cookie。这篇文章写得不错

2件事要做:

  • MachineKey在所有web.config(主域和子域)中应相同
  • AuthenticationCookie域名应相同

  • 按照文章进行更深入的研究。

    Jro的答案很好。但请确保更新webconfig表单身份验证
    设置“域”
    ,否则窗体身份验证注销将无法正常工作。是我遇到的签出问题。这里的技巧是使用“.”作为前缀,因为cookie的域设置为“.parent.com”(使用cookie检查器)

    
    
    在这里查看我的答案:我使用“FormsAuthentication.SetAuthCookie”设置cookie。有什么区别?
    <authentication mode="Forms">          
          <forms cookieless="UseCookies" defaultUrl="~/Default" loginUrl="~/user/signin" domain=".parent.com"  name="FormAuthentication" path="/"/>
        </authentication>