漫谈认证与授权
漫談?wù)J證與授權(quán)
Intro
認(rèn)證與授權(quán)一直以來(lái)都是很多人在討論的話題,之所以想這次談一談?wù)J證和授權(quán),主要是因?yàn)樽罱吹皆S多文章都把認(rèn)證和授權(quán)混為一談,把認(rèn)證方式當(dāng)作是授權(quán)方式。所以想寫篇文章談?wù)勎已壑械恼J(rèn)證與授權(quán)。
Authentication
什么是認(rèn)證?認(rèn)證是一個(gè)嘗試解決我是誰(shuí)的問(wèn)題的過(guò)程。
以一個(gè) HTTP 請(qǐng)求為例,認(rèn)證就是?嘗試?從請(qǐng)求信息中獲取用戶信息的過(guò)程,
有一點(diǎn)需要特別注意:認(rèn)證并不等于一定有用戶信息,有些文章直接把認(rèn)證等同于有用戶信息,再次強(qiáng)調(diào),認(rèn)證就是認(rèn)證,一定有用戶信息就相當(dāng)于是要授權(quán)了,有用戶信息只能說(shuō)明某種認(rèn)證方式認(rèn)證成功了,經(jīng)過(guò)某種方式認(rèn)證之后,還是沒(méi)有用戶信息,只能說(shuō)明這種認(rèn)證方式認(rèn)證失敗,認(rèn)證失敗并不代表授權(quán)失敗。
認(rèn)證的方式可以多種多樣,而且我們可以同時(shí)使用多種認(rèn)證方式:比如說(shuō) Cookie 認(rèn)證、JWT 認(rèn)證 以及其他自定義 Token 認(rèn)證,之所以稱之為認(rèn)證方式,是因?yàn)樗麄冎惶峁┙鉀Q我是誰(shuí)的解決方案,比如 Cookie 認(rèn)證會(huì)嘗試從 HTTP 請(qǐng)求攜帶的 Cookie 信息中獲取用戶信息,而 JWT 則是從 Authorization 請(qǐng)求頭中的 Bearer Token 獲取用戶的信息,自定義的Token 也類似。
甚至我們可以做一些擴(kuò)展,做一些不一樣的認(rèn)證,比如說(shuō)根據(jù) Header/QueryString Authentication,我在我們的項(xiàng)目里就是這么做的,網(wǎng)關(guān)解析出用戶信息之后轉(zhuǎn)發(fā)給下游服務(wù)的請(qǐng)求會(huì)把用戶信息放在請(qǐng)求頭里,我們自定義了一個(gè)?HeaderAuthentication?從請(qǐng)求頭中獲取用戶的信息,我們下游服務(wù)就可以用?HeaderAuthentication?替換原來(lái)使用的 JWT 認(rèn)證,這樣 JWT 只需要在網(wǎng)關(guān)處認(rèn)證一次即可,下游服務(wù)不再需要驗(yàn)證 token 的有效性以及解析這個(gè) token。
之前提供了一個(gè)開源版本的 Header/QueryString Authentication 的實(shí)現(xiàn),實(shí)現(xiàn)源碼:https://github.com/WeihanLi/AspNetCorePlayground/tree/master/WeihanLi.AspNetCore.Authentication
Authorization
什么是授權(quán)?授權(quán)顧名思義就是授予權(quán)限,允許查看或進(jìn)行某種操作。
授權(quán)是嘗試對(duì)用戶授予訪問(wèn)或操作權(quán)限的過(guò)程
如果一個(gè)資源是允許匿名訪問(wèn)的,那么無(wú)論認(rèn)證成功與否,無(wú)論有沒(méi)有用戶信息,都是可以授權(quán)訪問(wèn)的
如果一個(gè)資源是需要用戶有某個(gè)角色(Manager)才能訪問(wèn)的,那么首先我們應(yīng)該先通過(guò)認(rèn)證獲取用戶的信息,再判斷用戶是否有這個(gè)角色,如果有這個(gè)角色則允許授權(quán),否則都不應(yīng)授權(quán)訪問(wèn)。
如果認(rèn)證失敗就沒(méi)有用戶信息,沒(méi)有用戶信息,自然不可能具備 Manager 的角色,這時(shí)候就不應(yīng)該授權(quán)訪問(wèn),如果用戶沒(méi)有認(rèn)證成功,則需要用戶提供有效的認(rèn)證信息(用戶可能沒(méi)有提供認(rèn)證信息,也有可能是 token 過(guò)期等認(rèn)證信息無(wú)效的錯(cuò)誤),這時(shí)一般 Web 框架會(huì)返回?401 Unauthorized?,
如果用戶認(rèn)證成功了,但是沒(méi)有相應(yīng)的角色?Manager,這種情況 Web 框架一般會(huì)返回?403 Forbidden
如果用戶認(rèn)證成功了,并且擁有?Manager?的角色,則說(shuō)明用戶是有權(quán)限訪問(wèn)資源的,這時(shí)應(yīng)該授權(quán)用戶訪問(wèn)。
一點(diǎn)嘮叨:
允許匿名訪問(wèn)、需要用戶登錄才能訪問(wèn)、需要某種角色才能訪問(wèn)等這些都屬于授權(quán),不屬于認(rèn)證,就像允許匿名訪問(wèn),沒(méi)有用戶信息也可以訪問(wèn),但是并不影響認(rèn)證的過(guò)程,用戶認(rèn)證成功還是有用戶信息的。
Summary
認(rèn)證是一個(gè)嘗試解決我是誰(shuí)的問(wèn)題的過(guò)程。
授權(quán)是嘗試對(duì)用戶授予訪問(wèn)或操作權(quán)限的過(guò)程
More
最后安利一下,自己做的一個(gè)關(guān)于授權(quán)的項(xiàng)目?AccessControlHelper
AccessControlHelper?一個(gè)基于策略的授權(quán)解決方案,最早是基于 asp.net mvc 做的,實(shí)現(xiàn)了可以控制對(duì) Action 的訪問(wèn)和頁(yè)面上某個(gè)元素的訪問(wèn)(Conditional Server Render),后來(lái).netcore2.0 發(fā)布之后也支持了 .netcore,.netcore 下的支持更多一點(diǎn),支持 .net core 下的?TagHelper?和?Policy,現(xiàn)在的實(shí)現(xiàn)還有不太好,感興趣的可以上去看看,歡迎 issue/pr ...
Github:?https://github.com/WeihanLi/AccessControlHelper
Reference
https://github.com/WeihanLi/AspNetCorePlayground/tree/master/WeihanLi.AspNetCore.Authentication
https://github.com/WeihanLi/AccessControlHelper
總結(jié)
- 上一篇: Quartz.net定时任务的使用及获取
- 下一篇: 【译】gRPC vs HTTP APIs