淺談單點登陸(SSO)

来源:https://www.cnblogs.com/xiaomowang/archive/2019/07/24/11238692.html
-Advertisement-
Play Games

背景 在企業發展初期,企業使用的系統很少,通常一個或者兩個,每個系統都有自己的登錄模塊,運營人員每天用自己的賬號登錄,很方便。 但隨著企業的發展,用到的系統隨之增多,運營人員在操作不同的系統時,需要多次登錄,而且每個系統的賬號都不一樣,這對於運營人員 來說,很不方便。於是,就想到是不是可以在一個系統 ...


背景

在企業發展初期,企業使用的系統很少,通常一個或者兩個,每個系統都有自己的登錄模塊,運營人員每天用自己的賬號登錄,很方便。

但隨著企業的發展,用到的系統隨之增多,運營人員在操作不同的系統時,需要多次登錄,而且每個系統的賬號都不一樣,這對於運營人員

來說,很不方便。於是,就想到是不是可以在一個系統登錄,其他系統就不用登錄了呢?這就是單點登錄要解決的問題。

單點登錄英文全稱Single Sign On,簡稱就是SSO。它的解釋是:在多個應用系統中,只需要登錄一次,就可以訪問其他相互信任的應用系統。

如圖所示,圖中有4個系統,分別是Application1、Application2、Application3、和SSO。Application1、Application2、Application3沒有登錄模塊,而SSO只有登錄模塊,沒有其他的業務模塊,當Application1、Application2、Application3需要登錄時,將跳到SSO系統,SSO系統完成登錄,其他的應用系統也就隨之登錄了。這完全符合我們對單點登錄(SSO)的定義。

技術實現

在說單點登錄(SSO)的技術實現之前,我們先說一說普通的登錄認證機制。

乾貨:單點登錄(SSO)看這一篇就夠了

 

如上圖所示,我們在瀏覽器(Browser)中訪問一個應用,這個應用需要登錄,我們填寫完用戶名和密碼後,完成登錄認證。這時,我們在這個用戶的session中標記登錄狀態為yes(已登錄),同時在瀏覽器(Browser)中寫入Cookie,這個Cookie是這個用戶的唯一標識。下次我們再訪問這個應用的時候,請求中會帶上這個Cookie,服務端會根據這個Cookie找到對應的session,通過session來判斷這個用戶是否登錄。如果不做特殊配置,這個Cookie的名字叫做jsessionid,值在服務端(server)是唯一的。

同域下的單點登錄

一個企業一般情況下只有一個功能變數名稱,通過二級功能變數名稱區分不同的系統。比如我們有個功能變數名稱叫做:a.com,同時有兩個業務系統分別為:app1.a.com和app2.a.com。我們要做單點登錄(SSO),需要一個登錄系統,叫做:sso.a.com。

我們只要在sso.a.com登錄,app1.a.com和app2.a.com就也登錄了。通過上面的登陸認證機制,我們可以知道,在sso.a.com中登錄了,其實是在sso.a.com的服務端的session中記錄了登錄狀態,同時在瀏覽器端(Browser)的sso.a.com下寫入了Cookie。那麼我們怎麼才能讓app1.a.com和app2.a.com登錄呢?這裡有兩個問題:

  • Cookie是不能跨域的,我們Cookie的domain屬性是sso.a.com,在給app1.a.com和app2.a.com發送請求是帶不上的。
  • sso、app1和app2是不同的應用,它們的session存在自己的應用內,是不共用的。
乾貨:單點登錄(SSO)看這一篇就夠了

 

那麼我們如何解決這兩個問題呢?針對第一個問題,sso登錄以後,可以將Cookie的域設置為頂域,即.a.com,這樣所有子域的系統都可以訪問到頂域的Cookie。我們在設置Cookie時,只能設置頂域和自己的域,不能設置其他的域。比如:我們不能在自己的系統中給baidu.com的域設置Cookie。

Cookie的問題解決了,我們再來看看session的問題。我們在sso系統登錄了,這時再訪問app1,Cookie也帶到了app1的服務端(Server),app1的服務端怎麼找到這個Cookie對應的Session呢?這裡就要把3個系統的Session共用,如圖所示。共用Session的解決方案有很多,例如:Spring-Session。這樣第2個問題也解決了。

同域下的單點登錄就實現了,但這還不是真正的單點登錄。

不同域下的單點登錄

同域下的單點登錄是巧用了Cookie頂域的特性。如果是不同域呢?不同域之間Cookie是不共用的,怎麼辦?

這裡我們就要說一說CAS流程了,這個流程是單點登錄的標準流程。

乾貨:單點登錄(SSO)看這一篇就夠了

 

上圖是CAS官網上的標準流程,具體流程如下:

  1. 用戶訪問app系統,app系統是需要登錄的,但用戶現在沒有登錄。
  2. 跳轉到CAS server,即SSO登錄系統,以後圖中的CAS Server我們統一叫做SSO系統。 SSO系統也沒有登錄,彈出用戶登錄頁。
  3. 用戶填寫用戶名、密碼,SSO系統進行認證後,將登錄狀態寫入SSO的session,瀏覽器(Browser)中寫入SSO域下的Cookie。
  4. SSO系統登錄完成後會生成一個ST(Service Ticket),然後跳轉到app系統,同時將ST作為參數傳遞給app系統。
  5. app系統拿到ST後,從後臺向SSO發送請求,驗證ST是否有效。
  6. 驗證通過後,app系統將登錄狀態寫入session並設置app域下的Cookie。

至此,跨域單點登錄就完成了。以後我們再訪問app系統時,app就是登錄的。接下來,我們再看看訪問app2系統時的流程。

  1. 用戶訪問app2系統,app2系統沒有登錄,跳轉到SSO。
  2. 由於SSO已經登錄了,不需要重新登錄認證。
  3. SSO生成ST,瀏覽器跳轉到app2系統,並將ST作為參數傳遞給app2。
  4. app2拿到ST,後臺訪問SSO,驗證ST是否有效。
  5. 驗證成功後,app2將登錄狀態寫入session,併在app2域下寫入Cookie。

這樣,app2系統不需要走登錄流程,就已經是登錄了。SSO,app和app2在不同的域,它們之間的session不共用也是沒問題的。

有的同學問我,SSO系統登錄後,跳回原業務系統時,帶了個參數ST,業務系統還要拿ST再次訪問SSO進行驗證,覺得這個步驟有點多餘。他想SSO登錄認證通過後,通過回調地址將用戶信息返回給原業務系統,原業務系統直接設置登錄狀態,這樣流程簡單,也完成了登錄,不是很好嗎?

其實這樣問題時很嚴重的,如果我在SSO沒有登錄,而是直接在瀏覽器中敲入回調的地址,並帶上偽造的用戶信息,是不是業務系統也認為登錄了呢?這是很可怕的。

總結

單點登錄(SSO)的所有流程都介紹完了,原理大家都清楚了。總結一下單點登錄要做的事情:

  • 單點登錄(SSO系統)是保障各業務系統的用戶資源的安全 。
  • 各個業務系統獲得的信息是,這個用戶能不能訪問我的資源。
  • 單點登錄,資源都在各個業務系統這邊,不在SSO那一方。 用戶在給SSO伺服器提供了用戶名密碼後,作為業務系統並不知道這件事。 SSO隨便給業務系統一個ST,那麼業務系統是不能確定這個ST是用戶偽造的,還是真的有效,所以要拿著這個ST去SSO伺服器再問一下,這個用戶給我的ST是否有效,是有效的我才能讓這個用戶訪問。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首先我們還是先看一下WEB前端目前的工資情況吧,我在IT招聘網站拉勾網來進行搜索1-3年WEB前端工作經驗大專學歷的條件來看。 深圳: 可以看出目前深圳的平均的工資都在10K以上,因為大城市給的機會多,好公司也多,福利也好,所以在一線城市做WEB前端開發的,是非常稀缺的。 如果我們把標準降低在二線城 ...
  • vue更新換代很快,馬上vue都要出3.0了,這是一個巨大的變革,不過今天講的是vuecli3.0,裡面使用的vue仍然是2的,所有可以放心大膽使用。 Vue CLI 是一個基於 Vue.js 進行快速開發的完整系統,裡面所有具體介紹都可以去官網查看到 "vuecli官網移步" 這裡主要是講一些我實 ...
  • 譯者按: 使用 來捕獲所有的異常 原文: "Async Await Error Handling in JavaScript" 譯者: "Fundebug" 本文采用意譯,版權歸原作者所有 async/await 中的異常處理很讓人混亂。儘管有很多種方式來應對 "async 函數的異常" ,但是連經 ...
  • web前端全套視頻教程,html5,css3,javascript,.AngularJS. 下載地址 ...
  • 1.更換窗體圖標 方法:單擊窗體,更改icon屬性。 2.調整窗體打開時預設位置 方法:單擊窗體,更改StartPotion屬性。 3.修改窗體大小 方法:單擊窗體,更改Size屬性。 4.設置窗體的背景圖片 方法:單擊窗體,更改BackgroundImage屬性。 5.打開新窗體 首先新建一個窗體 ...
  • 1.馮·諾依曼體系 現代電腦的模型都是基於馮·諾依曼體系的,馮·諾依曼體系的基本組成有存儲器,計數器,控制器,輸入和輸出設備,總共有這五大本分組成。下圖是我基於這五大組成部分畫了一個組成圖來表示他們之間的關係,如圖1-1。 圖1-1 基於馮·諾依曼體系,首先控制器從記憶體中取出指令,有控制器來執行, ...
  • 前言 Adapter設計模式,允許客戶端使用介面不相容的類。 昨天收拾一些以前的東西,發現了藏在柜子里的一條線,這條線叫做OTG。這條線的一端是micro usb的輸出口,另一端是usb的輸入口。這條線,就是Adapter。手機如果想要使用U盤,會發現這個U盤的usb輸出口太大了,根本插不進手機的接 ...
  •   資料庫索引對於數據查詢的重要性不可言喻,因此作者在存儲層實現了二級索引,以及利用索引進行掃描的功能。目前僅實現了分區表與非分區表的本地索引(數據與索引共用一個Raft組管理),全局索引及反向索引待以後再實現。 一、存儲結構:   在介紹索引前先瞭解一下數據 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...