.net core实践系列之SSO-同域实现
前言
SSO的系列還是以.Net Core作為實(shí)踐例子與大家分享,SSO在Web方面復(fù)雜度分同域與跨域。本篇先分享同域的設(shè)計(jì)與實(shí)現(xiàn),跨域?qū)⒃谙缕c大家分享。
如有需要調(diào)試demo的,可把SSO項(xiàng)目部署為域名http://sso.cg.com/,Web1項(xiàng)目部署為http://web1.cg.com,http://web2.cg.com,可以減少配置修改量
源碼地址:https://github.com/SkyChenSky/Core.SSO
效果圖
SSO簡(jiǎn)介
單點(diǎn)登錄,全稱(chēng)為Single Sign On,在多個(gè)應(yīng)用系統(tǒng)中,用戶(hù)只需要登錄一次就可以訪(fǎng)問(wèn)所有相互信任的應(yīng)用系統(tǒng)。
它是一個(gè)解決方案,目的是為了整合企業(yè)內(nèi)多個(gè)應(yīng)用系統(tǒng),僅由一組賬號(hào)只需進(jìn)行一次登錄,就可被授權(quán)訪(fǎng)問(wèn)多個(gè)應(yīng)用系統(tǒng)。
流程描述
未登錄狀態(tài)訪(fǎng)問(wèn)業(yè)務(wù)Web應(yīng)用會(huì)引導(dǎo)到認(rèn)證中心。
用戶(hù)在認(rèn)證中心輸入賬號(hào)信息通過(guò)登錄后,認(rèn)證中心會(huì)根據(jù)用戶(hù)信息生成一個(gè)具有安全性的token,將以任何方式持久化在瀏覽器。
此后訪(fǎng)問(wèn)其他Web應(yīng)用的時(shí)候,必須攜帶此token進(jìn)行訪(fǎng)問(wèn),業(yè)務(wù)Web應(yīng)用會(huì)通過(guò)本地認(rèn)證或者轉(zhuǎn)發(fā)認(rèn)證而對(duì)token進(jìn)行校驗(yàn)。
從上圖可以簡(jiǎn)單的分析出三個(gè)關(guān)鍵點(diǎn):
Token的生成
Token的共享
Token校驗(yàn)
Token的生成
方式有多種:
可以通過(guò)Web框架對(duì)用戶(hù)信息加密成Token。
Token編碼方式也可以為JSON WEB TOKEN(JWT)
也可以是一段MD5,通過(guò)字典匹配保存在服務(wù)器用戶(hù)信息與MD5值
Token的共享
瀏覽器存儲(chǔ)有三種方式:
Cookie
容量4KB限制
過(guò)期時(shí)間
localStorage
容量5MB限制
生命周期永久
sessionStorage
容量5MB限制
生命周期當(dāng)前會(huì)話(huà),關(guān)閉瀏覽器則失效
無(wú)法與服務(wù)端交互
作為擁有會(huì)失效的會(huì)話(huà)狀態(tài),更因選擇Cookie存儲(chǔ)。那么Cookie的使用是可以在同域共享的,因此在實(shí)現(xiàn)SSO的時(shí)候復(fù)雜度又分為同域與跨域。
同域的共享比較簡(jiǎn)單,在應(yīng)用設(shè)置Cookie的Domain屬性進(jìn)行設(shè)置,就可以完美的解決。
Token校驗(yàn)
校驗(yàn)分兩種情況:
轉(zhuǎn)發(fā)給認(rèn)證中心認(rèn)證
由誰(shuí)授權(quán),就由誰(shuí)進(jìn)行身份認(rèn)證。授權(quán)與認(rèn)證是成對(duì)的。如果是以Cookie認(rèn)證,那就是服務(wù)端對(duì)token進(jìn)行解密。如果是服務(wù)端保存用戶(hù)信息,則匹配token值。
業(yè)務(wù)應(yīng)用自身認(rèn)證
不需要轉(zhuǎn)發(fā),那就意味著業(yè)務(wù)應(yīng)用認(rèn)證規(guī)則與認(rèn)證中心的認(rèn)證規(guī)則必須是一致的。
設(shè)計(jì)要點(diǎn)
原則上來(lái)講,只要統(tǒng)一Token的產(chǎn)生和校驗(yàn)方式,無(wú)論授權(quán)與認(rèn)證的在哪(認(rèn)證系統(tǒng)或業(yè)務(wù)系統(tǒng)),也無(wú)論用戶(hù)信息存儲(chǔ)在哪(瀏覽器、服務(wù)器),其實(shí)都可以實(shí)現(xiàn)單點(diǎn)登錄的效果。
此次使用.NET Core MVC框架,以Cookie認(rèn)證通過(guò)業(yè)務(wù)應(yīng)用自身認(rèn)證的方式進(jìn)行同父域的SSO實(shí)現(xiàn)。
為什么要使用Cookie認(rèn)證方式?
1.會(huì)話(huà)狀態(tài)分布在客戶(hù)瀏覽器,避免大量用戶(hù)同時(shí)在線(xiàn)對(duì)服務(wù)端內(nèi)存容量的壓力。
2.橫向擴(kuò)展良好性,可按需增減節(jié)點(diǎn)。
統(tǒng)一應(yīng)用授權(quán)認(rèn)證
將以Core的Cookie認(rèn)證進(jìn)行實(shí)現(xiàn),那么意味著每個(gè)應(yīng)用對(duì)用戶(hù)信息的加解密方式需要一致。
因此對(duì)AddCookie的設(shè)置屬性DataProtectionProvider或者TicketDataFormat的加密方式進(jìn)行重寫(xiě)實(shí)現(xiàn)。
.NET Core的SSO實(shí)現(xiàn)
Cookie認(rèn)證
認(rèn)證中心AddCookie的設(shè)置
業(yè)務(wù)應(yīng)用AddCookie的設(shè)置
基于設(shè)計(jì)要點(diǎn)的“統(tǒng)一應(yīng)用授權(quán)認(rèn)證”這一點(diǎn),兩者的區(qū)別不大,ticket的加密方式統(tǒng)一使用了AES,都指定Cookie.Domain =?".cg.com",保證了Cookie同域共享,設(shè)置了HttpOnly避免XSS攻擊。
兩者區(qū)別在于:
options.Events.OnRedirectToLogin = BuildRedirectToLogin; options.Events.OnSigningOut = BuildSigningOut;這是為了讓業(yè)務(wù)應(yīng)用引導(dǎo)跳轉(zhuǎn)到認(rèn)證中心登錄頁(yè)面。OnRedirectToLogin是認(rèn)證失敗跳轉(zhuǎn)。OnSigningOut是注銷(xiāo)跳轉(zhuǎn)。
登錄注銷(xiāo)
認(rèn)證中心與業(yè)務(wù)應(yīng)用兩者的登錄注冊(cè)基本一致。
HttpContext.SignInAsync的原理
使用的是Cookie認(rèn)證那么就是通過(guò)Microsoft.AspNetCore.Authentication.Cookies庫(kù)的CookieAuthenticationHandler類(lèi)的HandleSignInAsync方法進(jìn)行處理的。
源碼地址:https://github.com/aspnet/Security/blob/master/src/Microsoft.AspNetCore.Authentication.Cookies/CookieAuthenticationHandler.cs
從源碼我們可以分析出流程:
根據(jù)ClaimsPrincipal的用戶(hù)信息序列化后通過(guò)加密方式進(jìn)行加密獲得ticket。(默認(rèn)加密方式是的KeyRingBasedDataProtecto。源碼地址:https://github.com/aspnet/DataProtection)
再通過(guò)之前的初始化好的CookieOption再AppendResponseCookie方法進(jìn)行設(shè)置Cookie
最后通過(guò)Events.RedirectToReturnUrl進(jìn)行重定向到ReturnUrl。
Ticket加密
兩種設(shè)置方式
CookieAuthenticationOptions.DataProtectionProvider
CookieAuthenticationOptions.TicketDataFormat
DataProtectionProvider
如果做了集群可以設(shè)置到共享文件夾,在第一個(gè)啟動(dòng)的應(yīng)用則會(huì)創(chuàng)建如下圖的文件
options.DataProtectionProvider = DataProtectionProvider.Create(new DirectoryInfo(@"D:\sso\key"));TicketDataFormat
重寫(xiě)數(shù)據(jù)加密方式,本次demo使用了是AES.
options.TicketDataFormat = new TicketDataFormat(new AesDataProtector());?結(jié)尾
以上為.NET Core MVC的同域SSO實(shí)現(xiàn)思路與細(xì)節(jié) 。因編寫(xiě)demo的原因代碼復(fù)用率并不好,冗余代碼比較多,大家可以根據(jù)情況進(jìn)行抽離封裝。下篇會(huì)繼續(xù)分享跨域SSO的實(shí)現(xiàn)。如果對(duì)本篇有任何建議與疑問(wèn),可以在下方評(píng)論反饋給我。
原文地址:https://www.cnblogs.com/skychen1218/p/9773466.html
.NET社區(qū)新聞,深度好文,歡迎訪(fǎng)問(wèn)公眾號(hào)文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的.net core实践系列之SSO-同域实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: PEACHPIE 0.9.11 版本发布
- 下一篇: 开源硬件论坛,燃烧你的创造力