手撕公司SSO登錄原理

Single Sign-on

  SSO是老生常談的話題了,但部分同窗對SSO可能掌握的也是雲裏霧裏,只知其一;不知其二。本次手撕公司的SSO登錄原理,試圖以一種簡單,流暢的形式爲你提供 有用的SSO登錄原理。web

  按照本人一向行文風格,咱們先說什麼是SSO,爲何要提出SSO?api

SSO: 在多個系統中,只須要登錄一次,就能夠訪問其餘相互信任的應用系統, 這個技術的提出解決了:瀏覽器

  • 企業運行了多個服務,而帳號須要集中統一管理cookie

  • 終端用戶登錄一次,便可使用一個帳戶享受全部不一樣域名下服務。spa

 SSO 與CAS(Central Authentication System)這個概念密切相關,帳戶集中由某個服務管理,SSO服務只負責登錄認證。code

   登錄認證與【服務端在瀏覽器上寫入的認證Cookie】密切相關, Cookie 有一系列重要屬性:Domain,Path, Expiration,HttpOnly 決定了該Cookie 在客戶端的做用域、做用範圍、有效事件、有效操做方式blog

原理

 

用戶首次訪問 website1

① 用戶訪問website1 系統,website1系統須要認證, 用戶當前沒有登錄事件

② website1給客戶端返回302重定向響應, 客戶端重定向到SSO服務頁作用域

# 交互過程確實是臨時跳轉,下面傳參false, 返回302臨時重定向響應 域名

  context.Response.Redirect(ssoURL, false);

       用戶並無登錄SSO系統,因此SSO系統會返回登錄界面

③ 用戶在SSO登錄界面輸出帳戶/密碼

④ 登錄成功,SSO會在客戶端寫入一個 cookie for sso併產生一個301重定向響應,客戶端將重定向到原website1地址,該請求附帶了SSO給與此次認證成功的 ticket

      http://www.website1.com?ticket=XXXX-OOOO-XXXX-OOOO

⑤ website1收到以上重定向請求,解析QueryString中的ticket, 向SSO作一次ticket驗證; 驗證經過向客戶端寫入本站的 cookie for website

⑥ 上面第5步,瀏覽器地址會顯示:http://www.website1.com?ticket=XXXX-OOOO-XXXX-OOOO, 在本站驗證經過以後,最好再作一個重定向,返回業務首頁:www.website1.com, 本步驟不是SSO登錄的標準流程。

 

以後用戶訪問website2

① 用戶訪問website2, 用戶在website2並沒獲得認證;跳轉回 SSO

② SSO服務檢測到該 用戶在SSO域下存在Cookie for sso, 認定該用戶已經登錄,故跳轉回website2, 如上也會攜帶認證ticket

③ 如上,website2收到 website2.com?ticket=XXXX-OOOO-XXXX-OOOO請求, 會作一次SSO驗證; 驗證成功,寫入本站cookie for website2

 

重難點解釋

① SSO認證成功,寫入的cookie for sso, 是登錄到其餘系統的關鍵

② website1收到SSO認證成功的重定向請求,解析出 ticket=XXXX-OOOO-XXXX-OOOO, 爲何還要作一次SSO驗證?

    由於website1收到的來自SSO的重定向請求地址,有多是僞造, 因此在website1中須要去SSO驗證一次。

③ 標準的CAS登錄流程有兩次302客戶端重定向, 分別由原站點website1和SSO啓動。

  理論上 整個流程由服務端重定向也是能夠的 ?? 看官若發現有漏洞,可在評論區回覆。 

④ 退出SSO登錄, 要作兩件事情:

     - 向SSO發起api請求,請求SSO刪除用戶在SSO域下的認證cookie for sso

     - 移除本站的cookie for website1

⑤ 每一個website,至少須要以下sso配置     

  "SsoOptions": {
    "BaseAddress": "https://sso-cas.sso.com",       // 基地址
    "LoginPath": "/login",                             // sso登錄地址
    "LogoutPath": "/api/logout",                       // 退出sso登錄的api地址
    "ValidateTGTPath": "/api/validate",                // 驗證ticket的api地址 
    "UserInfoPath": "/api/v2/userinfo"                 // 從sso拿到登錄用戶信息的api地址
  },

 

That' all,這是本身對SSO登錄的一些理解, 本圖文 但願以流暢的思路記錄SSO, 但願各位看官不要吃快餐,知其然更知其因此然很關鍵。 

相關文章
相關標籤/搜索