1、前言html
今天開始學習Identity Server4,順便了解下.Net Core,以便於完善技術棧,最主要的是要跟上.Net的發展潮流,順便幫助各位整理下官方文檔,加上一些我本身對他的理解.api
這是官方文檔的地址瀏覽器
2、簡介安全
一、常見的網站的交互方式以下:服務器
(1)、瀏覽器與Web應用程序交互。單站點應用程序,一個站點搞定全部的東西,常見的有MVC、WebForm等等,這類通常不存在多客戶端之說,由於頁面和後臺處理程序是強耦合的,也就是說,這個時候咱們的後臺處理程序只處理對應的頁面,不能給其它的諸如IOS、Android等等設備調用,因此沒有安全一說.負載均衡
(2)、Web應用程序(多是本地的,也多是遠程的)與WebAPI通訊(有時是本身的,有時表明用戶)。多站點應用程序,這個時候咱們經過對業務的聚合提供一套完整的Web API給外界調用,調用者能夠是多種設備,好比IOS、Andriod、H5站點等.這個時候就有安全一說,由於這個時候若是你的API公開,不作任何的安全措施,意味着全部知道你接口的應用程序都能調用.這個時候你必須考慮安全問題分佈式
(3)、WebApi與WebApi之間的調用,通常用於規模較大的網站,由於當一個站點達到必定規模,勢必要對業務進行拆分,將不一樣的業務經過WebApi部署到不一樣的站點上,而後各個站點之間進行通訊,若是有必要能夠進行分佈式部署,用Nginx進行負載均衡.這個時候,也必須考慮站點的安全性,由於不能讓你的核心業務信任外界任何的調用.ide
因此,WebApi上的資源安全對咱們來講是很是重要的問題,必須保證我門的API受咱們的保護,只有通過咱們的認證以後,才能進行安全的訪問.一般,通常性的解決方法是,首先用戶(能夠是客戶端用戶、能夠是服務端用戶)經過了咱們的認證系統,而後咱們經過受權的方式,把這個資格開發給它.好比說編寫博客這個事情,只有註冊了並登錄博客園,纔會有這個資格,若是沒有註冊,那麼只能訪問博客園的公共資源.當讓這個例子不是很確切.學習
二、關於認證優化
(1)、簡單的認證方式
常見的簡單的認證方式通常就是設計一個註冊登錄系統,接着給咱們的Api接口繼承一個基類,基類裏面有判斷用戶是否登錄的操做,這樣就確保了咱們的Api只有註冊並登錄了咱們的系統的用戶才能訪問。可是Api與Api之間的訪問總不能也這麼設計吧?固然你能夠給每一個接口約定用戶名和密碼兩個參數,而後給API的調用者分配一個帳號密碼,讓Api在咱們控制範圍內的接受調用,可是沒人會去這麼幹,並且會存在安全隱患,好比抓包等等,並且系統這麼設計也不夠優雅,固然你能夠說用Https加密,可是這不是本文的重點.
(2)、認證協議
關於爲何要用認證協議請參考Web應用的認證機制常見的認證協議有SAML2p、WS-Federation和OpenIDConnect-SAML2p,它們是最流行和部署最普遍的。
(3)、OAuth 2.0認證
OAuth2是一種協議,容許應用程序從安全令牌服務請求訪問令牌,並使用它們與API通訊。此委託下降了客戶端應用程序和api的複雜性.
(4)、OpenID Connect
OpenIDConnect和OAuth2.0很是類似-實際上OpenIDConnect是OAuth2.0之上的一個擴展。兩個基本的安全問題,即身份驗證和API訪問,被組合成一個單一的協議-一般是安全令牌服務進行一次往返。咱們認爲,OpenIDConnect和OAuth2.0的結合是在可預見的未來保護現代應用程序的最佳方法。Identity yServer 4是這兩種協議的實現,而且通過高度優化以解決移動、本地和Web應用程序的典型安全問題。
三、Identity Server4
(1)、簡介
Identity Server4是一種中間件,它將符合規範的OpenIDConnect和OAuth2.0端點添加到任意ASP.NETCore應用程序中。也就是說你的移動端、本地應用程序只要符合OpenIDConnect和OAuth2.0協議,且你的ASP.NETCore應用程序也符合,那麼他們之間就能進行交互.
(2)、實現認證的方式
MS提供的圖,下面簡要介紹下:
Users:用戶
使用註冊客戶端而且想要訪問資源的人
Client:客戶端
客戶端是一種軟件,它從Identity Server請求令牌,令牌兩種第一種請求身份令牌一驗證用戶身份的標識令牌(下面會介紹)、另外一種是訪問令牌(下面會介紹)一要求訪問資源的令牌。客戶端在請求令牌以前必須先在Identity Server註冊。客戶端的示例包括Web應用程序、本地移動或桌面應用程序、服務器進程等。
Resources:資源
資源是你但願使用Identity保護的資源,通常有兩種:一是用戶數據、二是Api資源
Identity Data:Identity數據
關於用戶的身份數據標識信息,例如姓名或電子郵件地址等用戶信息.
Identity Token:驗證用戶身份的標識令牌
標識令牌表示身份驗證過程的結果。它至少包含一個用戶標識符(稱爲Subaka Subject Claimation)和關於用戶身份驗證的方式和時間的信息。它能夠包含其餘身份數據。
Access Token:訪問令牌
訪問令牌容許訪問API資源。客戶端請求訪問令牌並將它們轉發給API。訪問令牌包含有關客戶端和用戶的信息(若是存在的話)。API使用該信息來受權對其數據的訪問。
那麼大體的流程就是這樣,首先用戶使用客戶端,接着客戶端註冊了Identity,並向Identity申請令牌,接着Identity就開始驗證用戶信息,經過將用戶的信息存儲到Identity Data裏面,接着經過OpenIDConnect協議與客戶端進行對話(向請求頭中添加一些必要信息,並進行數據加密等操做),發放Identity Token,若是用戶須要訪問Api資源,那麼去申請Access Token,經過將你的訪問令牌(並遵循通OAuth2.0協議,向請求中添加一些必要信息,並進行數據加加密等操做))的同時將你的令牌轉發給Api,經過那麼就能夠正常訪問Api。
四、Identity Server4能幹的事
固然Indentity能幹的事不僅是在遵循安全協議的狀況下,發送安全令牌這麼簡單(固然也不簡單!).
它還能有效的保護您的資源,並提供會話管理和單點登陸管理等等.