一個功能完備的.NET開源OpenID Connect/OAuth 2.0框架——IdentityServer3


今天推薦的是我一直以來都在關注的一個開源的OpenID Connect/OAuth 2.0服務框架——IdentityServer3。其支持完整的OpenID Connect/OAuth 2.0標准,使用它就可以輕易地搭建一個單點登錄服務器。

說是一直關注,是因為1年前,要為一個平台搭建一個OAuth 2.0服務器,當時由於IdentityServer3還處於開發階段,核心還不穩定,擴展功能也不完備。無奈只好熟讀OAuth 2.0的規范,並根據www.asp.net網站上的一個簡單示例自己實現了一個。不過現在好了,IdentityServer3在今年初正式發布穩定的1.0版本。注:IdentityServer3的開發商之前就有IdentityServer2的產品,不過是IdentityServer3基於微軟最新的ASP.NET技術(比如OWIN等思想),以中間件的形式出現,更具擴展性。

為什么會出現IdentityServer3這樣的框架呢?現代應用程序或多或少都是如下這樣的架構:

appArch

在這種情況下,前端、中間層和后端都需要進行驗證和授權來保護資源,所以不能僅僅在業務邏輯層或者服務接口層來實現基礎的安全功能。為了解決這樣的問題,通常就會導致如下安全架構:

protocols

上圖其實是把整個安全問題分解為兩個方面:驗證和API訪問。

所謂驗證,就是應用程序需要知道當前用戶是誰。通常應用程序都會管理用戶信息,並代表用戶來訪問用戶被授權的資源。這對於典型的Web應用程序很常見,但是對於原生應用程序或基於JS的應用程序也是需要驗證。所以業界就制定了各種各樣的通用驗證協議:SAML2p、WS-Federation和OpenID Connect。SAML2p之前運用的比較廣泛,不過作為后起之秀的OpenID Connect(其本質是基於OAuth 2.0擴展而來)對現代的應用程序(尤其移動應用)而言更加適合。

對於API訪問。應用程序有兩種方式來和API進行通信:使用應用程序自己的標識,或者代表用戶使用用戶的標識。OAuth2協議就允許應用程序先從安全令牌服務哪里請求一個訪問令牌,然后隨后用這個令牌來和API進行通信(API會訪問令牌服務器來驗證訪問者的令牌是否有效)。這就降低了客戶應用程序和API之間的復雜度,因為驗證和授權都被中心化了。

由於OpenID Connect和OAuth 2.0非常類似,所以IdentityServer3的目標就是同時支持兩者。其支持如下的標准:

  • OpenID Connect Core 1.0:basic, implicit 和 hybrid flows
  • OpenID Connect Discovery 1.0
  • OpenID Connect Session Management 1.0 - draft 22
  • OAuth 2.0:authorization code, implicit, resource owner password credentials and client credentials grant
  • OAuth 2.0 Bearer Token Usage
  • OAuth 2.0 Multiple Response Types
  • OAuth 2.0 Form Post Response Mode
  • OAuth 2.0 Token Revocation

IdentityServer3作為一個框架,具有很多擴展點(見官方文檔Service Factory章節),也附帶了很多擴展包:

  • 核心包:定義核心的對象模型,服務實現和服務器實現。內置了簡單的用於測試的一些內存配置和存儲實現。
  • 配置存儲包:保存配置信息(clients和scopes),有EF和MongoDb可選。
  • 用戶存儲包:保存用戶標識,有MembershipReboot和ASP.NET Identity可選。
  • 其他插件包:WS-Federation協議支持,訪問令牌驗證擴展
  • 第三方擴展包:比如本地化擴展等

最后想談談我們是否應該把這樣的框架用於我們產品(尤其在比較關鍵的安全相關功能)中,也即是否應該“重復制造輪子”的問題。

在我看來,“我們可以重復創造自己的汽車,但是絕對不要重復制造輪子”。尤其對於初創的小團隊更是如此,小團隊應該把精力用於快速驗證業務可行性上。首先,你無法保證在制造輪子這件事情上比其他人(比如IdentityServer3的開發者一直都是做驗證框架和服務器的)更專業;其次,你制造的輪子維護性肯定比現成的輪子更難(除非你打算自造輪子的原因就是有私心讓別人無法接手),也比現成的輪子學習成本更難(團隊其他成員無法快速地基於現有文檔快速入手);最后,現成的輪子就算有欠缺,那么正確的態度是參與開源項目來完善它促進社區發展,而不是因噎廢食。

“閱讀原文”是IdentityServer3的官方文檔目錄。可以先通讀文檔后,來判斷是否用於自己的產品。

原文地址:http://identityserver.github.io/Documentation/docs/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM