了解以下內容對ASP.NET 5中的驗證中間件應用有很大幫助!
OAUTH2是目前很多大型網站都使用的對外提供開放資源接口的應用標准,比入taobao\alipay\騰訊\豆瓣等。它和目前的另外一種OPENID標准是不同的兩個概念,OPENID是提供用戶驗證的,而OAUTH是提供授權的,是OPENID的一個升級版本,由兩個機構負責維護的。OPENID的最新標准OpenID Connect【(Identity, Authentication) + OAuth 2.0 = OpenID Connect】,ASP.NET 5也提供了這種新標准的支持,他在OAUTH2的基礎上作了升級,在OAUTH2驗證完后多了一個ID_TOKEN,可以獲得更多用戶信息,同時是以json格式做交互,更適合RESTful風格的app,進而適合任何不同的客戶端程序。
理解OAUTH其實很簡單,最重要是弄清楚幾個角色名詞和它的授權步驟即可,以我們常用的在第三方網站使用QQ賬戶登陸為例:
①資源持有者(User用戶或者其他app,好比你在QQ上的賬戶)在客戶端(第三方網站)登陸 --->②資源持有者使用用戶名密碼登錄后,驗證服務器(驗證客戶端的Id和用戶名密碼),讓資源持有者授權客戶端統一允許訪問的資源范圍,例如你的注冊資料(authorization grant)等 --->③上一步同意授權和授權范圍后,客戶端向驗證服務器申請資源訪問授權令牌access token(這個動作一般在客戶端后台執行,所以有時候看不到)--->④客戶端經驗證服務器驗證通過發放資源訪問授權令牌 --->⑤客戶端收到資源訪問令牌后向資源服務器(其實就是授權訪問能訪問的資料,比如獲取用戶資料的Action,但是要判斷下客戶端能訪問不能訪問了)要資源
上邊的步驟中的粗體就是需要了解的四個名詞,大概步驟就是以上這個樣子。
OAUTH2中有好幾種驗證的流程模型,在ASP.NET4.5>中默認的驗證模型是密碼流程驗證模式,這種模式比較簡單,復雜縝密的其實類似上邊的步驟說明,屬於授權碼流程模式,感興趣的自己看下文檔。密碼流程驗證模式如下圖:
密碼流程驗證模式有個弊端,就是用戶必須把用戶名密碼提供給客戶端,客戶端不能保存密碼。這種模式適用客戶端是一個項目的程序或者屬於你自己一個公司自己開發的程序,客戶端必須高度信任。(當然以上驗證和授權服務器可以分開也可以一起)
OPENID CONNECT的流程類似以上步驟(參考這里)
+--------+ +--------+ | | | | | |---------(1) AuthN Request-------->| | | | | | | | +--------+ | | | | | | | | | | | End- |<--(2) AuthN & AuthZ-->| | | | | User | | | | RP | | | | OP | | | +--------+ | | | | | | | |<--------(3) AuthN Response--------| | | | | | | |---------(4) UserInfo Request----->| | | | | | | |<--------(5) UserInfo Response-----| | | | | | +--------+ +--------+
(1)PR(客戶端)發送請求到OP(OpenId提供者,e.g 驗證服務器)
(2)OP驗證最終用戶並獲得授權
(3)OP相應給客戶端一個id taoken,通常就是access token
(4)RP攜帶access token請求到用戶信息端(授權資源)
(5)用戶信息端返回最終用戶的用戶聲明信息
看起來和OAUTH非常相似,它缺點就是太新了,還很少有應用,Google很早已經應用了該標准。Asp.net5已經有人實現了OPENID CONNECT 的服務器端中間件,還有非常不錯的例子,可以參考看下https://github.com/aspnet-security/AspNet.Security.OpenIdConnect.Server
