2009-03-03 134 views
25

身份驗證發生在子域而不是父域時,是否可以通過子域對用戶進行身份驗證?跨子域的表單身份驗證

例如:

用戶登錄到site1.parent.com,然後我們需要把它們發送到reporting.parent.com。

即使登錄發生在子域,我是否可以向報告網站驗證它們?

到目前爲止,我所做的所有研究都有用戶先登錄到父域,然後每個子域都可以訪問身份驗證cookie。

+0

在這裏看到我的回答:http://stackoverflow.com/a/14781927/3661 – 2013-02-08 21:55:47

回答

10

您可以將cookie設置爲認證時的父域,但必須明確設置它,它將默認爲您所在的完整域。

將auth cookie正確設置爲父域後,所有子域都應能夠讀取它。

4

是的,當然。您可能需要在某個階段推出自己的產品,但應該可行。

其中一個想法是,當您將它們重定向到邊界時,給它們一次性通行令牌,然後告訴接收子域期望它們(此用戶從此IP獲得此令牌)。

29

當您對用戶進行身份驗證時,請將身份驗證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)); 
+1

我用 「FormsAuthentication.SetAuthCookie」 設置cookie。有什麼不同? – 2017-04-18 16:14:11

7

作爲一個方面說明,我發現,使用這些行之有效+1,JRO的方法後,從比其他子域調用時FormsAuthenication.SignOut()方法不起作用萬維網/。 (我猜是因爲財產。域不匹配) - 要解決這個問題我用:

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); 
      } 
3

兩件事:

  1. 的machineKey應該在所有的web.config(主域和子域)
  2. AuthenticationCookie域名應該是一樣一樣的。

按照following文章更深入。

4

Jro的答案正常。但請務必更新webconfig表單身份驗證setting "domain" ,否則表單身份驗證登出將無法正常工作。 Here是我遇到的註銷問題。這裏的伎倆是有一個'。'作爲域的前綴,並將cookie設置爲「.parent.com」(使用Cookie檢查器)。

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