到一號(hào)通:高校學(xué)工系統(tǒng)統(tǒng)一身份認(rèn)證實(shí)戰(zhàn))
每年九月學(xué)工系統(tǒng)第一波流量高峰就來(lái)了。教學(xué)樓里到處是新生拿著手機(jī)問(wèn)志愿者“迎新系統(tǒng)、學(xué)工系統(tǒng)、繳費(fèi)平臺(tái)是一回事嗎為什么密碼規(guī)則都不一樣”旁邊輔導(dǎo)員也在翻口袋——獎(jiǎng)助學(xué)金系統(tǒng)一套口令、心理測(cè)評(píng)系統(tǒng)一套口令、綜合測(cè)評(píng)系統(tǒng)又一套。這類場(chǎng)景幾乎每年都在高校信息部門(mén)重演也是“統(tǒng)一身份認(rèn)證”最常被提上日程的導(dǎo)火索。所謂“一號(hào)通”本質(zhì)上就是讓全校師生只認(rèn)一個(gè)主賬號(hào)、只在統(tǒng)一認(rèn)證入口登錄一次就能帶著登錄狀態(tài)自由進(jìn)出已接入的學(xué)工業(yè)務(wù)系統(tǒng)。這篇文章不以理論手冊(cè)為目標(biāo)而是結(jié)合我實(shí)際參與某高校學(xué)工系統(tǒng)統(tǒng)一身份認(rèn)證建設(shè)時(shí)的方案設(shè)計(jì)、技術(shù)選型、對(duì)接調(diào)試和上線后運(yùn)維經(jīng)驗(yàn)把“一號(hào)通”背后的原理和坑講清楚。1. 從“一堆賬號(hào)”到“一號(hào)通”學(xué)工系統(tǒng)為什么要?jiǎng)舆@個(gè)手術(shù)1.1 賬號(hào)密碼多到連輔導(dǎo)員都受不了從學(xué)生視角看一個(gè)在校生常用的賬號(hào)至少有這些學(xué)工系統(tǒng)、教務(wù)系統(tǒng)、圖書(shū)館系統(tǒng)、一卡通自助平臺(tái)、校園網(wǎng)認(rèn)證、云盤(pán)、課程平臺(tái)。每套系統(tǒng)由不同廠商建設(shè)賬號(hào)密碼規(guī)則各不相同。有系統(tǒng)要求字母數(shù)字特殊字符有系統(tǒng)只認(rèn)6位純數(shù)字有系統(tǒng)一年強(qiáng)制改一次密碼。密碼規(guī)則越復(fù)雜記不住的人越多結(jié)果是有人把密碼寫(xiě)在本子上有人所有系統(tǒng)用同一個(gè)簡(jiǎn)單密碼有人每學(xué)期第一件事就是去服務(wù)臺(tái)重置密碼。從輔導(dǎo)員角度看賬號(hào)問(wèn)題帶來(lái)的負(fù)擔(dān)更隱蔽。獎(jiǎng)助學(xué)金材料提交通常要登錄學(xué)工系統(tǒng)但需要先在校內(nèi)統(tǒng)一門(mén)戶認(rèn)證再跳轉(zhuǎn)進(jìn)業(yè)務(wù)頁(yè)面如果門(mén)戶會(huì)話過(guò)期填了一半的表單沒(méi)了學(xué)生就會(huì)反復(fù)來(lái)問(wèn)。實(shí)踐里我們統(tǒng)計(jì)過(guò)某學(xué)年迎新季服務(wù)臺(tái)“忘記密碼”類工單占總工單量接近四成其中一半來(lái)自學(xué)工相關(guān)系統(tǒng)。這個(gè)數(shù)字看起來(lái)很小但每一張工單背后都是學(xué)生辦事的停頓感。統(tǒng)一身份認(rèn)證要解決的正是這類由“身份碎片化”導(dǎo)致的重復(fù)勞動(dòng)。真正容易忽略的是安全面同一個(gè)密碼在多系統(tǒng)復(fù)用后一旦某個(gè)老系統(tǒng)被攻擊拖庫(kù)攻擊者會(huì)拿賬號(hào)密碼去“撞”其他系統(tǒng)。學(xué)工系統(tǒng)里存著學(xué)生家庭情況、獎(jiǎng)懲信息、資助記錄是高敏業(yè)務(wù)。把認(rèn)證入口統(tǒng)一起來(lái)降低多口令記憶負(fù)擔(dān)同時(shí)減少跨系統(tǒng)弱口令復(fù)用這才是“一號(hào)通”真正的底層價(jià)值。1.2 統(tǒng)一身份認(rèn)證到底在“統(tǒng)一”什么我經(jīng)常要跟業(yè)務(wù)部門(mén)解釋統(tǒng)一身份認(rèn)證不是把所有業(yè)務(wù)系統(tǒng)合并成一個(gè)大系統(tǒng)也不是強(qiáng)制大家把數(shù)據(jù)庫(kù)賬號(hào)表交出來(lái)。它的核心是四件事。第一統(tǒng)一主賬號(hào)。每名師生在認(rèn)證中心里只有一條身份記錄擁有一個(gè)全局唯一ID。業(yè)務(wù)系統(tǒng)可以繼續(xù)用自己的內(nèi)部賬號(hào)但必須與這個(gè)全局ID建立映射。第二統(tǒng)一登錄入口。瀏覽器或App里的登錄統(tǒng)一收斂到認(rèn)證中心完成。業(yè)務(wù)系統(tǒng)不再各自輸入密碼而是識(shí)別“這個(gè)人已經(jīng)通過(guò)認(rèn)證中心驗(yàn)證過(guò)”直接放行。第三統(tǒng)一會(huì)話憑證。認(rèn)證成功后在瀏覽器或客戶端里生成可跨系統(tǒng)識(shí)別的會(huì)話憑證。我訪問(wèn)學(xué)工系統(tǒng)登錄一次再去資助系統(tǒng)、心理測(cè)評(píng)系統(tǒng)就不用重新輸密碼。這是“一號(hào)通”最直觀的體驗(yàn)來(lái)源。第四統(tǒng)一審計(jì)入口。所有系統(tǒng)在認(rèn)證環(huán)節(jié)產(chǎn)生的失敗、鎖定、風(fēng)險(xiǎn)告警都從認(rèn)證中心集中出日志。以前出安全問(wèn)題要翻五個(gè)系統(tǒng)現(xiàn)在首頁(yè)看一張表。還有一個(gè)容易被忽略的邊界統(tǒng)一身份認(rèn)證管的是“你是不是某某”不是“你能不能干某件事”。學(xué)工系統(tǒng)里的“輔導(dǎo)員只能看本學(xué)院學(xué)生”“資助專員才能查看貧困認(rèn)定結(jié)果”屬于授權(quán)需要權(quán)限中心或業(yè)務(wù)系統(tǒng)自己的角色體系來(lái)實(shí)現(xiàn)。把認(rèn)證和授權(quán)混在一起是不少學(xué)校踩坑的根源。2. 我理解的SSO核心組件與協(xié)議分工2.1 認(rèn)證中心、票據(jù)、應(yīng)用客戶端三者怎么配合用門(mén)衛(wèi)來(lái)類比比較直觀。認(rèn)證中心就是大樓一樓門(mén)衛(wèi)業(yè)務(wù)系統(tǒng)是樓里的各個(gè)辦公室。師生進(jìn)門(mén)時(shí)門(mén)衛(wèi)驗(yàn)一次身份發(fā)一張臨時(shí)出入證去財(cái)務(wù)辦公室、輔導(dǎo)員辦公室、圖書(shū)館辦公室都不用再驗(yàn)身份出示出入證即可。如果出入證過(guò)期或丟失才需要回到門(mén)衛(wèi)處重新領(lǐng)。技術(shù)實(shí)現(xiàn)上最常見(jiàn)的是“重定向 票據(jù)校驗(yàn)”模型。大致分六步用戶首次訪問(wèn)學(xué)工系統(tǒng)的某個(gè)頁(yè)面應(yīng)用發(fā)現(xiàn)有本地會(huì)話就放行沒(méi)有的話把目標(biāo)地址打包引導(dǎo)瀏覽器跳轉(zhuǎn)到認(rèn)證中心登錄頁(yè)。用戶在認(rèn)證中心輸入賬號(hào)密碼或其他憑證認(rèn)證中心校驗(yàn)成功后在認(rèn)證中心域下種一個(gè)全局會(huì)話憑證CAS里叫TGTOIDC里叫ID Token/Refresh Token。認(rèn)證中心生成一次性票據(jù)CAS的ST或OIDC的authorization code通過(guò)瀏覽器重定向帶回業(yè)務(wù)系統(tǒng)。業(yè)務(wù)系統(tǒng)拿到票據(jù)后不一定信任瀏覽器傳來(lái)的而是通過(guò)服務(wù)端向認(rèn)證中心發(fā)起校驗(yàn)請(qǐng)求換取該用戶的核心身份信息。認(rèn)證中心校驗(yàn)票據(jù)有效返回用戶ID、姓名、學(xué)工號(hào)等必要屬性。業(yè)務(wù)系統(tǒng)在本地建立自己的會(huì)話后續(xù)頁(yè)面訪問(wèn)不再經(jīng)過(guò)認(rèn)證中心直到本地會(huì)話超時(shí)或用戶主動(dòng)退出。這個(gè)模型的關(guān)鍵是瀏覽器在業(yè)務(wù)系統(tǒng)和認(rèn)證中心之間只傳遞一次性票據(jù)密碼不經(jīng)過(guò)業(yè)務(wù)系統(tǒng)票據(jù)用完即廢。我接入學(xué)工老系統(tǒng)時(shí)經(jīng)常跟廠商說(shuō)不要再拿數(shù)據(jù)庫(kù)賬號(hào)表做“二次密碼校驗(yàn)”那等于把統(tǒng)一認(rèn)證繞回去了。真正的統(tǒng)一是讓每個(gè)應(yīng)用相信“認(rèn)證中心說(shuō)你是誰(shuí)”這件事情。我們?yōu)槭裁醋越ㄕJ(rèn)證中心而不是直接買(mǎi)一個(gè)現(xiàn)成的SaaS因?yàn)閷W(xué)工場(chǎng)景涉及大量校內(nèi)身份數(shù)據(jù)且需要跟教務(wù)、人事、一卡通等內(nèi)部系統(tǒng)做數(shù)據(jù)聯(lián)動(dòng)私有化部署更可控。當(dāng)然很多廠商也有成熟的平臺(tái)產(chǎn)品但本質(zhì)上都逃不開(kāi)上述“認(rèn)證中心—票據(jù)—應(yīng)用客戶端”的角色分工。2.2 協(xié)議選型CAS、OIDC、SAML在學(xué)工場(chǎng)景里怎么挑協(xié)議選型是“一號(hào)通”項(xiàng)目的第一個(gè)大決策。學(xué)工系統(tǒng)生態(tài)里老系統(tǒng)多、新系統(tǒng)也多不存在一個(gè)協(xié)議包打天下。我偏好按場(chǎng)景混用但不混在一個(gè)應(yīng)用里。協(xié)議/框架典型形態(tài)主要特點(diǎn)學(xué)工場(chǎng)景適配CAS傳統(tǒng)Web應(yīng)用協(xié)議簡(jiǎn)單票據(jù)機(jī)制成熟適合純?yōu)g覽器頁(yè)面老版學(xué)工系統(tǒng)、門(mén)戶網(wǎng)站常用仍需保留OAuth 2.0 / OIDCWeb、App、小程序支持授權(quán)碼、PKCE、Access Token適合移動(dòng)端和API場(chǎng)景新系統(tǒng)、校內(nèi)移動(dòng)辦公應(yīng)用強(qiáng)烈推薦SAML老牌企業(yè)級(jí)平臺(tái)XML斷言適合與外包廠商遺留平臺(tái)互通偶爾遇到建議做兼容適配不主動(dòng)選為什么很多學(xué)校至今還用CAS因?yàn)闅v史包袱。接入了幾十個(gè)老系統(tǒng)它們?cè)缇蛯?shí)現(xiàn)了CAS客戶端改造只需配置一下認(rèn)證中心地址。CAS本身對(duì)單點(diǎn)登錄支持很成熟但面向App、小程序、前后端分離架構(gòu)時(shí)略顯吃力。OIDC則更現(xiàn)代原生支持移動(dòng)端和API授權(quán)安全模型也更完善。我在設(shè)計(jì)時(shí)采取的是“核心協(xié)議OIDC 老系統(tǒng)CAS橋接”的混合方案。新接入的學(xué)工應(yīng)用優(yōu)先OIDC老系統(tǒng)能改CAS就改CAS不能改的認(rèn)證中心側(cè)提供CAS協(xié)議適配端點(diǎn)。這樣做的好處是不會(huì)為了新協(xié)議把舊應(yīng)用全部重寫(xiě)也能保住“一號(hào)通”的體驗(yàn)一致性。還有一個(gè)常被問(wèn)到的問(wèn)題能不能用LDAP直接對(duì)接LDAP主要是目錄同步和統(tǒng)一認(rèn)證的一種底層方式但它解決的是“賬號(hào)密碼驗(yàn)證”不解決“瀏覽器免登跳轉(zhuǎn)”。如果所有應(yīng)用都直接連LDAP校驗(yàn)密碼密碼依然會(huì)暴露給全部業(yè)務(wù)系統(tǒng)一旦某個(gè)系統(tǒng)被攻破密碼庫(kù)就泄漏了。所以LDAP可以做用戶目錄源卻不能替代SSO協(xié)議作為學(xué)工系統(tǒng)的統(tǒng)一認(rèn)證入口。3. 學(xué)工系統(tǒng)的身份生命周期比企業(yè)SSO復(fù)雜在哪3.1 賬號(hào)狀態(tài)從新生未入校到離校歸檔每個(gè)狀態(tài)都要有歸屬企業(yè)的賬號(hào)生命周期通常很清晰入職創(chuàng)建、離職刪除。學(xué)校卻復(fù)雜得多。一個(gè)學(xué)生的狀態(tài)至少包括錄取待報(bào)到、新生待激活、在校正常、休學(xué)、復(fù)學(xué)、轉(zhuǎn)專業(yè)、保留學(xué)籍、退學(xué)、畢業(yè)、離校、校友。不同狀態(tài)對(duì)系統(tǒng)訪問(wèn)權(quán)限完全不同。更麻煩的是新生在報(bào)到前可能就需要登錄迎新系統(tǒng)完成個(gè)人信息采集、宿舍床位選擇、繳費(fèi)確認(rèn)。這意味著“一號(hào)通”的賬號(hào)不能等到入學(xué)才建立而是招生錄取名單出來(lái)時(shí)就要預(yù)建檔產(chǎn)生預(yù)賬號(hào)。預(yù)賬號(hào)不能像正式在校生一樣放行全部權(quán)限但必須能登錄迎新相關(guān)應(yīng)用。這里要設(shè)計(jì)一個(gè)“未激活”狀態(tài)只能訪問(wèn)迎新板塊激活后才變成正式身份。離校學(xué)生也要小心。學(xué)生畢業(yè)了學(xué)工系統(tǒng)里的歷史班級(jí)記錄、獎(jiǎng)助學(xué)金材料還要被輔導(dǎo)員和審計(jì)查閱所以賬號(hào)不能刪除只能“歸檔”。歸檔賬號(hào)不能登錄日常業(yè)務(wù)但具備只讀查詢權(quán)限或者完全不登錄由業(yè)務(wù)系統(tǒng)使用歷史快照提供數(shù)據(jù)。我們?cè)陧?xiàng)目里把賬號(hào)狀態(tài)模型作為最重要的數(shù)據(jù)設(shè)計(jì)甚至比密碼策略更上心——因?yàn)闋顟B(tài)錯(cuò)了權(quán)限就會(huì)錯(cuò)。還有一種容易被忽略的情況休學(xué)學(xué)生。校園卡被停掉統(tǒng)一認(rèn)證賬號(hào)如果也被停掉等學(xué)生復(fù)學(xué)時(shí)發(fā)現(xiàn)無(wú)法登錄又要去服務(wù)臺(tái)重置。更好的做法是“鎖定”而不是“刪除”并保留全局身份ID不變。復(fù)學(xué)審批通過(guò)后系統(tǒng)自動(dòng)解鎖賬號(hào)、歷史數(shù)據(jù)、關(guān)聯(lián)消息全部恢復(fù)。我們后來(lái)在運(yùn)維手冊(cè)里專門(mén)寫(xiě)了一條學(xué)工系統(tǒng)的學(xué)籍異動(dòng)推送必須同步觸發(fā)認(rèn)證中心賬號(hào)狀態(tài)變更不能等信息部門(mén)人工處理。3.2 多源數(shù)據(jù)同步與“全局身份ID”的建立學(xué)工系統(tǒng)的身份數(shù)據(jù)不是憑空造的它依賴多個(gè)源頭教務(wù)系統(tǒng)提供學(xué)號(hào)和在讀狀態(tài)人事系統(tǒng)提供輔導(dǎo)員和行政老師信息招生系統(tǒng)提供錄取名單一卡通系統(tǒng)提供卡狀態(tài)宿舍管理系統(tǒng)提供住宿樓棟。這些系統(tǒng)的標(biāo)識(shí)各不相同有人用學(xué)號(hào)有人用身份證號(hào)有人用一卡通卡號(hào)。如果不做映射就會(huì)出現(xiàn)“同一個(gè)人在三套系統(tǒng)里被當(dāng)成三個(gè)人”的悲劇。我在項(xiàng)目里用的辦法是建立一張“全局身份映射表”認(rèn)證中心自己生成全局ID比如純數(shù)字序列或UUID再把每個(gè)業(yè)務(wù)系統(tǒng)的內(nèi)部賬號(hào)ID作為屬性關(guān)聯(lián)到該全局ID下。同步規(guī)則遵循主數(shù)據(jù)優(yōu)先以教務(wù)/研究生系統(tǒng)為學(xué)籍唯一權(quán)威源以人事系統(tǒng)為人事唯一權(quán)威源。數(shù)據(jù)同步采用實(shí)時(shí)消息定時(shí)對(duì)賬結(jié)合學(xué)籍異動(dòng)消息立刻推送到認(rèn)證中心并更新?tīng)顟B(tài)每天凌晨做一次全量對(duì)賬發(fā)現(xiàn)差異后生成告警工單不自動(dòng)覆蓋。為什么不能用身份證號(hào)當(dāng)全局ID因?yàn)闅v史數(shù)據(jù)里確實(shí)存在空號(hào)、錯(cuò)號(hào)留學(xué)生沒(méi)有本地身份證港澳臺(tái)學(xué)生證件類型復(fù)雜。用業(yè)務(wù)系統(tǒng)自帶學(xué)號(hào)也會(huì)出問(wèn)題轉(zhuǎn)專業(yè)轉(zhuǎn)班級(jí)后學(xué)號(hào)可能保留但有些合并院校中學(xué)號(hào)會(huì)變更還有預(yù)科、專升本等特殊路徑學(xué)號(hào)可能重新生成。全局ID一旦確定終身不變只標(biāo)志“身份的存在”不承載業(yè)務(wù)語(yǔ)義。這個(gè)設(shè)計(jì)在“一號(hào)通”后續(xù)對(duì)接數(shù)據(jù)中臺(tái)時(shí)幫了大忙后面所有系統(tǒng)只要關(guān)聯(lián)全局ID就可以匯總數(shù)據(jù)不會(huì)再出現(xiàn)對(duì)不上人的情況。4. “一號(hào)通”落地實(shí)施從賬號(hào)治理到老系統(tǒng)對(duì)接4.1 賬號(hào)清洗與激活讓每一條身份記錄可追溯真正動(dòng)手前我強(qiáng)烈建議先做賬號(hào)盤(pán)點(diǎn)不要急著搭認(rèn)證服務(wù)器。我們當(dāng)時(shí)從八個(gè)業(yè)務(wù)系統(tǒng)里導(dǎo)出了賬號(hào)表按身份證號(hào)、學(xué)號(hào)、姓名做初步匹配發(fā)現(xiàn)三類問(wèn)題一是歷史離職人員和轉(zhuǎn)校生賬號(hào)沒(méi)有停用仍顯示正常二是同一學(xué)生因轉(zhuǎn)專業(yè)在不同系統(tǒng)里生成了兩條記錄三是不少賬號(hào)綁定的是已經(jīng)廢棄的手機(jī)號(hào)沒(méi)法做密保找回。這些問(wèn)題不清理統(tǒng)一身份認(rèn)證上線后會(huì)把原來(lái)的“隱形問(wèn)題”變成“平臺(tái)上的顯性問(wèn)題”。清洗工作按“匹配-合并-停用-補(bǔ)錄”四步走。先以教務(wù)數(shù)據(jù)為準(zhǔn)把每名學(xué)生的唯一身份記錄建好然后合并同一人的多個(gè)賬號(hào)對(duì)無(wú)法匹配的賬號(hào)標(biāo)記待核實(shí)核實(shí)確實(shí)不存在的賬號(hào)停用并歸檔。整個(gè)過(guò)程要有業(yè)務(wù)部門(mén)簽字確認(rèn)尤其是獎(jiǎng)助和宿舍數(shù)據(jù)避免誤刪。清洗之后是激活環(huán)節(jié)。老系統(tǒng)的賬號(hào)往往是管理員發(fā)初始密碼統(tǒng)一身份認(rèn)證上線后我們改成“自助激活”模式新生在迎新頁(yè)面輸入錄取通知書(shū)編號(hào)和身份證后六位設(shè)置新密碼并綁定本人手機(jī)號(hào)教職工由人事入職流程觸發(fā)激活短信。初始密碼只能使用一次激活后立即失效。這么做的好處是認(rèn)證中心里不會(huì)積壓一批長(zhǎng)期沒(méi)人用但密碼可能被別人知道的“僵尸賬號(hào)”。運(yùn)維上我們會(huì)盯一個(gè)指標(biāo)——新生激活率第一年要求新生報(bào)到前激活率達(dá)到95%以上否則說(shuō)明引導(dǎo)路徑有問(wèn)題需要優(yōu)化。4.2 認(rèn)證中心接入學(xué)工主流程的配置要點(diǎn)賬號(hào)和狀態(tài)就緒后接入工作反而更像“配參數(shù)”。最核心的是三件事。第一回調(diào)地址白名單。無(wú)論是CAS的service參數(shù)還是OIDC的redirect_uri必須做精確匹配。很多安全問(wèn)題都出在回調(diào)地址過(guò)寬。學(xué)工系統(tǒng)的域名可能有好幾個(gè)門(mén)戶老域名、新域名、校內(nèi)測(cè)試域名每次都要在認(rèn)證中心白名單里單獨(dú)維護(hù)不該用通配符懶省事。第二票據(jù)與會(huì)話有效期。這個(gè)配置直接影響體驗(yàn)。票據(jù)有效期太短用戶填表隔了半小時(shí)就跳回登錄頁(yè)太長(zhǎng)則安全風(fēng)險(xiǎn)上升。我們的經(jīng)驗(yàn)是單點(diǎn)登錄全局會(huì)話默認(rèn)8小時(shí)業(yè)務(wù)系統(tǒng)本地會(huì)話默認(rèn)30分鐘敏感操作獎(jiǎng)助審批、離校確認(rèn)單次會(huì)話15分鐘。超時(shí)后不要求整個(gè)門(mén)戶重新登錄只要求對(duì)該業(yè)務(wù)系統(tǒng)重新做一次身份確認(rèn)。第三Cookie作用域和通信協(xié)議。瀏覽器里明文傳輸票據(jù)等同于裸奔所以所有回調(diào)地址和認(rèn)證中心地址必須走HTTPS。Cookie的Domain不要隨手設(shè)置成根域尤其注意應(yīng)用自己的會(huì)話Cookie名不能和認(rèn)證中心的Cookie重名否則就會(huì)出現(xiàn)下一節(jié)那種“登錄了就掉線”的怪問(wèn)題。接入校內(nèi)移動(dòng)辦公App時(shí)認(rèn)證中心還需要暴露OIDC授權(quán)端點(diǎn)并通過(guò)App內(nèi)部的免密通道換取用戶身份。移動(dòng)端場(chǎng)景下瀏覽器里的Cookie機(jī)制基本失效要靠Authorization Code PKCE流程。很多廠商把secret內(nèi)置到App里是不對(duì)的正確做法是App通過(guò)后端服務(wù)保存客戶端密鑰前端只發(fā)起授權(quán)請(qǐng)求。4.3 一次離校系統(tǒng)反復(fù)登錄失敗的排查全記錄這里說(shuō)一個(gè)我印象很深的坑離校系統(tǒng)接好CAS后用戶從門(mén)戶進(jìn)去點(diǎn)“離校事務(wù)辦理”馬上又彈回登錄頁(yè)反復(fù)循環(huán)。接口聯(lián)調(diào)時(shí)單點(diǎn)測(cè)試是好的門(mén)戶跳轉(zhuǎn)到認(rèn)證中心后也能拿到登錄頁(yè)但在離校系統(tǒng)本地會(huì)話一直建立不起來(lái)。排查第一條線是看票證校驗(yàn)。在認(rèn)證中心日志里發(fā)現(xiàn)ticket確實(shí)被離校系統(tǒng)服務(wù)端請(qǐng)求校驗(yàn)了而且校驗(yàn)結(jié)果成功用戶屬性也正確返回。這就很奇怪服務(wù)端明明拿到了用戶信息為什么瀏覽器還是被重定向回登錄頁(yè)第二條線看應(yīng)用日志。離校系統(tǒng)的后臺(tái)日志顯示“session created”但下一條請(qǐng)求又找不到session。我讓廠商把Cookie抓出來(lái)發(fā)現(xiàn)認(rèn)證中心和離校系統(tǒng)都叫“session_id”而且認(rèn)證中心把Cookie的Domain寫(xiě)成了父域離校系統(tǒng)自己的session Cookie則沒(méi)設(shè)Domain。瀏覽器按名字域管理Cookie兩個(gè)Cookie同名后面的覆蓋前面的導(dǎo)致用戶會(huì)話被反復(fù)“頂?shù)簟薄8蛎鞔_后修改也簡(jiǎn)單把離校系統(tǒng)的會(huì)話Cookie名改成“l(fā)x_session_id”同時(shí)把認(rèn)證中心的TGT Cookie限制在認(rèn)證中心自有域名內(nèi)不做父域下發(fā)。改完再測(cè)登錄流程穩(wěn)定了。這條經(jīng)驗(yàn)后來(lái)寫(xiě)進(jìn)了我們的對(duì)接規(guī)范里接入統(tǒng)一認(rèn)證的應(yīng)用先自查會(huì)話Cookie命名和Domain不要使用和認(rèn)證中心同名的常見(jiàn)名稱如果業(yè)務(wù)系統(tǒng)框架默認(rèn)就必須改。還有一個(gè)小問(wèn)題部分老系統(tǒng)沒(méi)有做“單點(diǎn)退出”。用戶從統(tǒng)一門(mén)戶退出后回到離校系統(tǒng)還能直接看到自己信息因?yàn)閼?yīng)用本地會(huì)話沒(méi)被銷毀。單點(diǎn)退出的實(shí)現(xiàn)比登錄更麻煩CAS的SLO和OIDC的logout都依賴所有應(yīng)用配合。我們退而求其次——不在應(yīng)用本地做強(qiáng)制的同步銷毀而是在統(tǒng)一門(mén)戶的退出頁(yè)停留幾秒讓各個(gè)應(yīng)用收到退出通知后清掉本地會(huì)話。雖然不是百分之百實(shí)時(shí)但至少能避免“看似退出、實(shí)際還在登錄”的暴露。5. 從“能登錄”到“好用”體驗(yàn)與安全的雙向平衡5.1 常見(jiàn)登錄方式在學(xué)工場(chǎng)景下怎么選“一號(hào)通”上線后登錄方式的選擇直接影響師生愿不愿意用。我們做過(guò)一期反饋學(xué)生最反感的是“密碼圖片驗(yàn)證碼”雙重阻力因?yàn)閳D片驗(yàn)證碼在自研老系統(tǒng)里經(jīng)常模糊難認(rèn)。而老師群體更在意速度和穩(wěn)定性不愿意在手機(jī)和電腦間來(lái)回切換。以下是我在學(xué)工場(chǎng)景里的建議登錄方式優(yōu)點(diǎn)缺點(diǎn)適用場(chǎng)景密碼 智能驗(yàn)證碼通用性強(qiáng)老驗(yàn)證碼體驗(yàn)差默認(rèn)兜底方案手機(jī)短信驗(yàn)證碼無(wú)需記密碼找回快短信有成本可能被轟炸激活、找回、首次登錄掃碼登錄手機(jī)確認(rèn)即可體驗(yàn)順滑需要App或公眾號(hào)配合機(jī)房電腦、公共機(jī)房最適合校內(nèi)App免密辦公人群接受度高依賴第三方生態(tài)老師、輔導(dǎo)員使用頻率高生物識(shí)別體驗(yàn)最好涉及隱私采集爭(zhēng)議不建議作為強(qiáng)制項(xiàng)僅限自助終端要注意“一號(hào)通”不等于“只有一種登錄方式”。統(tǒng)一認(rèn)證中心要同時(shí)支持多因子疊加比如學(xué)生校外訪問(wèn)時(shí)密碼登錄后要求小程序確認(rèn)老師敏感模塊操作時(shí)需要短信二次確認(rèn)。這些策略不是每個(gè)業(yè)務(wù)系統(tǒng)自己做而是認(rèn)證中心發(fā)布時(shí)可配置的風(fēng)險(xiǎn)規(guī)則業(yè)務(wù)系統(tǒng)只需要透?jìng)饕粋€(gè)“當(dāng)前操作是否需要二次認(rèn)證”的參數(shù)即可。還有一類體驗(yàn)優(yōu)化容易被忽視登錄后的無(wú)感跳轉(zhuǎn)。學(xué)工系統(tǒng)里的待辦往往分散在個(gè)人門(mén)戶、輔導(dǎo)員PDA、學(xué)工大屏等多個(gè)應(yīng)用。我們做了聚合待辦卡片學(xué)生從門(mén)戶點(diǎn)一個(gè)待辦帶著統(tǒng)一會(huì)話直達(dá)目標(biāo)頁(yè)面目標(biāo)頁(yè)面未接入統(tǒng)一認(rèn)證時(shí)再由服務(wù)端代為處理后展示。這樣“一號(hào)通”的便捷感才真正落地。5.2 弱口令、異地登錄、高頻嘗試怎么防“號(hào)好用了”安全就不能省。統(tǒng)一身份認(rèn)證平臺(tái)本身變成了全校最高價(jià)值的攻擊目標(biāo)防護(hù)等級(jí)要比其他業(yè)務(wù)系統(tǒng)高一檔。第一道防線是弱口令治理。我們?cè)谡J(rèn)證中心密碼策略里內(nèi)置了常用弱密碼字典包括常見(jiàn)數(shù)字序列、學(xué)號(hào)后六位、姓名拼音加生日這些高頻組合。學(xué)生改密碼時(shí)會(huì)直接拒絕命中字典的新口令。密碼本身不能明文存儲(chǔ)用迭代次數(shù)足夠高的哈希算法保存首次激活時(shí)校驗(yàn)新口令強(qiáng)度和是否與舊密碼復(fù)用。第二道防線是登錄風(fēng)險(xiǎn)控制。賬號(hào)連續(xù)失敗5次鎖定15分鐘同IP短時(shí)間失敗次數(shù)超過(guò)一定閾值觸發(fā)驗(yàn)證碼異地IP或深夜登錄要求短信/校內(nèi)App確認(rèn)。規(guī)則可以在認(rèn)證中心集中配置不需要每個(gè)業(yè)務(wù)系統(tǒng)重復(fù)實(shí)現(xiàn)。實(shí)測(cè)下來(lái)鎖定策略能擋住絕大多數(shù)暴力破解嘗試但也別設(shè)太死——比如宿舍里幾個(gè)同學(xué)共用同一出口IP導(dǎo)致IP一樣短時(shí)間內(nèi)有人輸錯(cuò)密碼不能把整個(gè)樓層的學(xué)生都鎖了要按賬號(hào)維度而不是IP維度做嚴(yán)格限制。第三道防線是異常會(huì)話檢測(cè)。我們會(huì)在認(rèn)證中心記錄登錄設(shè)備指紋和常用IP庫(kù)。用戶檢測(cè)到新的登錄設(shè)備時(shí)推送一條“你的統(tǒng)一身份賬號(hào)在新設(shè)備登錄”的提醒信息如果用戶不認(rèn)可可以一鍵踢下線該會(huì)話并重置密碼。這套邏輯跟互聯(lián)網(wǎng)產(chǎn)品的“賬號(hào)安全中心”類似學(xué)工系統(tǒng)里的學(xué)生很快就能掌握。安全策略的設(shè)計(jì)還有一個(gè)原則不要在“登錄”這一下把所有安全手段都堆上去。頻繁讓學(xué)生做二次驗(yàn)證會(huì)逼他們尋找繞過(guò)路徑。更好的方法是分級(jí)——默認(rèn)密碼可登錄高風(fēng)險(xiǎn)操作獎(jiǎng)助金審核、離校信息修改、家庭困難認(rèn)定再疊加一次短信確認(rèn)或MFA。把驗(yàn)證資源花在最需要的地方。6. 上線之后我建議留意的幾個(gè)運(yùn)維細(xì)節(jié)6.1 監(jiān)控指標(biāo)、日志審計(jì)與降級(jí)應(yīng)急統(tǒng)一身份認(rèn)證上線不是終點(diǎn)真正考驗(yàn)人的是持續(xù)運(yùn)維。我們平時(shí)主要盯五類指標(biāo)認(rèn)證中心QPS、登錄成功率、認(rèn)證平均耗時(shí)、密碼失敗次數(shù)和賬號(hào)鎖定量。高峰期選課、迎新、成績(jī)發(fā)布要提前壓測(cè)認(rèn)證中心一般不會(huì)成為瓶頸但如果并發(fā)訪問(wèn)量突然飆到日常十倍會(huì)話緩存、數(shù)據(jù)庫(kù)連接都要檢查。日志審計(jì)不能只在出問(wèn)題時(shí)才看。統(tǒng)一認(rèn)證記錄的是誰(shuí)在什么時(shí)間用什么方式登錄了哪個(gè)系統(tǒng)這個(gè)數(shù)據(jù)是校內(nèi)安全事件調(diào)查的第一證據(jù)。至少要保證近180天登錄日志在線可查包括成功、失敗、鎖定、退出、票據(jù)簽發(fā)等全量事件。業(yè)務(wù)側(cè)配合上各接入應(yīng)用的服務(wù)端日志也要保存足夠長(zhǎng)的時(shí)間不能只靠認(rèn)證中心單方日志定位問(wèn)題。降級(jí)方案是最容易被忽略的。認(rèn)證中心一旦宕機(jī)所有接入系統(tǒng)都會(huì)面臨“無(wú)法登錄”的連帶故障。我們提前和業(yè)務(wù)廠商約定應(yīng)急模式認(rèn)證中心不可用超過(guò)10分鐘啟用臨時(shí)登錄頁(yè)允許業(yè)務(wù)系統(tǒng)使用本地的賬號(hào)表做密碼校驗(yàn)。這樣做犧牲了統(tǒng)一會(huì)話和統(tǒng)一審計(jì)但至少保證學(xué)生能登錄系統(tǒng)完成緊急辦事。應(yīng)急模式入口要嚴(yán)格限制并在日志中顯著標(biāo)記事后復(fù)盤(pán)為什么要啟用、用了多久、哪些系統(tǒng)被臨時(shí)放開(kāi)。注意降級(jí)本身也是安全事件的高危時(shí)段不能隨意放開(kāi)。6.2 下一步演進(jìn)從一號(hào)通到數(shù)據(jù)通、權(quán)限通統(tǒng)一身份認(rèn)證跑穩(wěn)之后很多后續(xù)項(xiàng)目會(huì)自然依賴它。我建議團(tuán)隊(duì)把身份數(shù)據(jù)當(dāng)成數(shù)字校園的“地基”來(lái)運(yùn)營(yíng)而不是只做一個(gè)登錄頁(yè)。比如學(xué)生畫(huà)像系統(tǒng)需要跨部門(mén)匯總考勤、成績(jī)、獎(jiǎng)助、心理測(cè)評(píng)數(shù)據(jù)如果沒(méi)有全局ID光數(shù)據(jù)匹配就要消耗大量人工現(xiàn)在統(tǒng)一身份認(rèn)證有了全局ID各系統(tǒng)數(shù)據(jù)直接關(guān)聯(lián)數(shù)據(jù)中臺(tái)的建設(shè)成本會(huì)明顯下降。權(quán)限體系也要往前看。學(xué)工系統(tǒng)里的角色很多輔導(dǎo)員、學(xué)院副書(shū)記、資助專員、心理健康教育專員、學(xué)生骨干?,F(xiàn)在不少學(xué)校這些角色在各個(gè)系統(tǒng)里各管一套管理員維護(hù)角色要反復(fù)配置。接下來(lái)可以把角色和權(quán)限模型往認(rèn)證中心上層收構(gòu)建統(tǒng)一權(quán)限中心用RBAC/ABAC策略統(tǒng)一控制“誰(shuí)能看、能改、能批”。認(rèn)證中心只管身份權(quán)限中心管授權(quán)兩者配合才是我理解中的“一號(hào)通”長(zhǎng)期形態(tài)。另外電子簽章、電子離校單、網(wǎng)上繳費(fèi)、勤工助學(xué)工資單這類應(yīng)用如果都能基于統(tǒng)一身份認(rèn)證的強(qiáng)會(huì)話能力和審計(jì)鏈路去做業(yè)務(wù)數(shù)據(jù)與身份數(shù)據(jù)的關(guān)聯(lián)會(huì)更加穩(wěn)妥。將來(lái)做新生數(shù)據(jù)分析、畢業(yè)生離校協(xié)同也都能沉淀成標(biāo)準(zhǔn)化服務(wù)。最后說(shuō)一點(diǎn)個(gè)人體會(huì)。我在整個(gè)項(xiàng)目里最大的感悟是一號(hào)通不是單純的技術(shù)改造而是把散落在各個(gè)院系和廠商手里的身份語(yǔ)義重新整理了一遍。它真正的價(jià)值不在于“少輸入幾次密碼”而在于讓每一名師生背后的數(shù)據(jù)有機(jī)會(huì)被正確連接、被安全調(diào)度。如果正在規(guī)劃類似項(xiàng)目的朋友建議先從賬號(hào)數(shù)據(jù)狀態(tài)梳理開(kāi)始不要被協(xié)議和架構(gòu)的術(shù)語(yǔ)嚇住把人的身份和狀態(tài)理清楚了后面的工作會(huì)順暢很多。