2008-12-04 106 views
41

我們提供多種在線服務。我們需要開發一個系統,如果用戶從一個服務(在domain1.com上)轉移到另一個服務(在domain2.com上),可以爲用戶提供快速/簡單的體驗。跨域登錄 - 如何從一個域轉移到另一個域時自動登錄用戶

是否有一種安全可靠的方法,在他轉移到新服務後自動自動登錄用戶?

如果下面的解決方案完全不安全/錯誤,請大聲吼我。

我們正在考慮類似的密碼恢復了一些在線服務提供的系統 - 他們是通過電子郵件了一個獨特的哈希到期其中,使他們能夠更改其密碼的鏈接。

domain1.com會生成一個唯一的哈希值,並將其存儲在連接到用戶以及一個到期時間字段的哈希數據庫。

用戶將被轉移到domain2.com/auto/?hash=d41d8cd98f00b204e9800998ecf8427e

domain2.com接下來會做出與哈希domain1.com的請求,以獲取有關用戶的信息。然後domain1.com會從數據庫中刪除散列。 domain2.com將登錄的用戶,並設置餅乾等

東西能基於OpenID的OAuth的或達到同樣的效果?

回答

6

如果有人能夠在中間玩男人並獲得該哈希值,他們是否能夠竊取跨域轉移?顯然它需要在需要使用它之前生成併發送給客戶端。所以說例如:

我正在玩傑克中間人。 傑克訪問domain1.com這導致一個散列被準備併發送給他,以便當他訪問domain2.com時,他可以發送該散列作爲認證。 當他訪問domain1.com時,他的請求通過我,您返回頁面,我抓住散列並讓他繼續。 我使用散列訪問domain2.com,您現在讓我進入domain2.com並刪除散列。 他不明智,直到他試圖登錄到domain2.com並被告知他的憑證不再有效。

你如何克服這一點?

+4

使用SSL。如果傑克驗證域名1,你不能玩中間人。com服務器,並有一個保密的頻道。 – erickson 2008-12-04 23:41:38

+0

好點。理論上這應該意味着OPs模型應該相當安全,因爲它假設他們現在使用SSL。 – BenAlabaster 2008-12-05 01:34:31

5

這是一個很好的解決方案。這裏有兩點考慮:

您使用「散列」,但目前還不清楚,你會湊什麼數據。相反,請使用「nonce」:由密碼質量RNG生成的大數(128位)數字。

而且,你沒有指定這個,但用戶和兩個域之間的通信,和域之間的本身,必須是安全的。使用SSL對服務器進行身份驗證並保持現時的機密性。

108

單點登錄(SSO)在概念上非常簡單。

  • 用戶點擊domain1.com
  • domain1.com看到沒有會話cookie。
  • domain1.com重定向到sso.com
  • sso.com呈現登錄頁面,並採取憑證
  • sso.com套會話cookie對用戶
  • sso.com然後重定向回domain1到一個特殊的URL(如domain1.com/ssologin
  • ssologin URL包含一個基本上由sso.com「簽名」的參數。它可以像使用共享密鑰對loginid進行加密的base64一樣簡單。
  • domain1.com將加密的令牌解密,使用新的登錄ID登錄用戶。
  • domain1爲用戶設置會話cookie。

現在,下一個案例。

  • 用戶點擊domain2.com,這是繼domain1和重定向到sso.com
  • sso.com已經爲用戶的cookie,所以不與加密信息呈現登錄頁面
  • sso.com重定向回domain2.com
  • domain2.com登錄用戶。

這是如何工作的基本原理。您可以使它更強大,功能更豐富(例如,這是SSOn,但不是SSOff,用戶可以「註銷」domain1,但仍然登錄到domain2)。您可以使用公鑰來簽署證書,您可以請求從SSO服務器傳輸更多信息(如授權等)。您可以進行更加貼心的整合,例如域定期檢查用戶是否仍享有來自SSO服務器的權限。

但是,通過瀏覽器使用重定向的cookie握手是所有這些SSO解決方案所基於的關鍵基礎。

+0

我喜歡這種方法...當然,它依靠另一個領域來完成這項工作。這又增加了複雜性。我不能自己想出一個更好的解決方案+1 – BenAlabaster 2008-12-05 01:36:57

2

SEO怎麼樣? 它看起來像成功登錄之前的每個請求被重定向到其他域和後面。 我會說這很醜陋。 你應該發送什麼標題? 301到SSO,然後返回301到原始頁面?所以搜索機器人是「請求」改變他的索引兩次?

6

除非您在整個會話中使用SSL,否則使用SSL進行跨域登錄不會有任何意義。竊取會話cookie就像在網址中使用散列一樣簡單。如果會話的其餘部分不安全,將散列隱藏在SSL中有什麼意義。

頂端給出的方法幾乎是標準方法。您是否選擇使用安全協議完全是另一回事,但僅對部分會話進行加密將毫無意義。