2011-03-17 327 views
0

我有一個服務器說'XYZ'和許多不同域的客戶端,說A,B和C.認證是在服務器完成。 - 當用戶第一次到達任何網站時,我們會要求他爲該網站創建帳戶。他會輸入電子郵件和密碼。我們將數據發送到服務器並存儲thr。現在他已經在'XYZ'賬戶中登記,以便他可以登錄到任何A,B和C站點。php會話登錄系統

下一步:例如說,他來到B站點登錄,他輸入電子郵件和密碼。我們會將這些數據提交給服務器來驗證,如果密碼與電子郵件相匹配,我們會將狀態'是'發送回客戶端,以便他成功登錄並進入內部頁面。

因爲發送電子郵件和狀態'yes'返回碰撞並不安全。我們正在使用套接字編程。這樣外界的人就不會知道我們正在發送什麼數據並回來了。 因爲我們使用套接字,所以我們無法創建任何會話或cookie,因爲我們沒有在瀏覽器中打開服務器站點。

我想,如:當用戶成功登錄到站點B.如果同時在下一個選項卡他去站點C.他不應該要求登錄(不應顯示登錄頁面)。他會自動登錄(進入內頁)。

+0

哇,這是*從未*工作過! :)另外,我爲你的問題添加了一些相關的標籤。 – Charles 2011-03-17 06:50:52

回答

4

你正在尋找的東西叫single sign-on(縮寫爲SSO),這是一個難以正確解決的問題。有lots and lots of SSO schemes,其中所有的都以自己特殊的方式吸得可怕

您的目標方式的一個主要障礙是我們通常如何跟蹤網絡登錄:cookies。特別是,一個域只能設置屬於它的Cookie。這意味着如果您的三個網站位於三個不同的域中,則不能讓一個網站爲其他網站設置Cookie。

解決此問題的常用方法是實際將驗證服務置於另一個域名上。無論何時您需要檢查用戶是否已登錄,都可以將他們指向該驗證服務。流行的統一登錄機制OpenID使用這種技術。 OpenID是StackOverflow使用的。 (如果你使用各種StackExchange站點,你可能已經注意到你有時可以在加載頁面後自動登錄到其他站點,但我仍不確定這是如何工作的,並且還沒有調查過。 )

從你所描述的,你會通過中央認證服務。你甚至可能會發現,實現一個基於OpenID的系統甚至可以爲你的網站工作......但如果你這樣做,我鼓勵你隱藏整個URIs作爲身份的事情的複雜性,普通的最終用戶是不太可能的瞭解這個概念。

+0

你說過:「無論何時您需要檢查用戶是否已登錄,都會將他們引導至該身份驗證服務。」指導他們服務器後應該做些什麼?我無法設置Cookie。因爲認證是通過套接字完成的。我應該在數據庫中設置一個變量嗎? – aparna 2011-03-17 07:07:46

+0

我的意思是,你應該將用戶引導至認證服務器進行認證,然後讓用戶以後用適當的SSO令牌發送回原始網站。然後,原始站點可以使用SSO令牌向認證服務器發送請求,以查看發生了什麼 - 用戶是否自動登錄,是手動登錄還是未登錄。 – Charles 2011-03-17 07:32:04

0

您可以在用戶登錄XYZ網站後在瀏覽器中設置Cookie嗎?

因此,現在當用戶訪問網站A,B或C時,您可以檢查Cookie是否針對XYZ域進行設置,如果是,則可以登錄該用戶。但請注意,您只能在(XYZ)子域之間共享cookie,而不能在不同域之間共享cookie。

+0

我也無法設置cookie。我有在數據庫中設置變量的想法,無論他是否登錄或不爲特定的IP地址。我不知道它是否會起作用。 – aparna 2011-03-17 06:52:53

+0

請參考以下內容設置跨子域的Cookie:http://www.w3schools.com/php/func_http_setcookie.asp – 2011-03-17 07:00:36

+0

網站不是服務器的子域,它們是完全不同的域。 – aparna 2011-03-17 07:24:45