4分50
api
不須要身份認證
客戶端叫作HybirdClient
配置IdentityServer服務端,先把客戶端添加上
把userClaims添加到token裏面
而後運行服務端就能夠了服務器
和以前的配置差很少,先把代碼貼上
和以前的區別多是這裏的相應類型有區別
啓動地址端口改爲 7000端口
HomeController須要處理,首先須要登錄
服務端的端口也須要改爲7000
mvc
一運行客戶端就會跳轉到受權服務器
登錄,請求權限
成功跳轉
ide
以前把以前的代碼所有複製到HomeController和兩個View頁面內
測試
mvc的客戶端有這麼一句話
服務端把這裏設置爲true,表示把claims放到idToken裏面
運行mvc客戶端看到的結果,這些是直接從idToken裏面獲取出來的
客戶端把claims的映射的clear方法這句話註釋掉
能夠看到Claims的key是這種樣子的。這就是jwt的claimType。剛纔比較簡潔的方式是well-know的方式
複製這裏的idToken
複製到jwt.io網站解析
把那句話註釋的,客戶端的 再也不註釋
左右對比這些值
例如這些都沒有出如今咱們客戶端的Userclaims上
這是由於們咱們使用的這個中間件,默認會過濾掉認爲咱們不須要的claims。例如:nbf、exp等等
那麼怎麼防止這些東西被過濾掉
在客戶端,有個集合會把集合內的cliams給過濾掉,例如這裏咱們這裏把nbf給從集合remove掉,就不會過濾這個nbf了
須要從新登錄一下,再次運行客戶端就看到nbf這些都有了
sid和sub 設置被過濾掉
仍是在客戶端設置
這樣就被過濾掉了
網站
之前比較流行的方式是基於角色來受權ui
角色具體在生產環境中怎麼維護先無論,這裏演示 先都寫死
這是服務端的設置,這裏是身份的認證信息
添加一個新的角色的Scope,這個scope的名字叫作roles,它裏面有個claim就是role
而後設置讓咱們的客戶端能夠訪問這個roles
而後配置客戶端,客戶只要在這裏添加一個scope就能夠了
登錄後咱們看到出現了一個scope叫作角色
客戶端,當前角色是管理員,能夠看到了,
設置客戶端的Action只能管理員訪問
默認的首頁管理和普通用戶均可以訪問
沒有映射mvc客戶端裏面的角色
先把index的橘色設置這個註釋掉,加斷點進行調試。user.IsInRole判斷用戶時候包含這個管理員的角色
當前用戶不是管理員。
看一下user的claims、確實有一個role可是這個role並無成爲咱們mvc角色系統裏面那個role。因此這裏須要某種映射
客戶端進行映射。nameClaimType和RoleClaimType分別取的是jwtClaimType裏面的類型
再次運行結果是true。看一下user的identity的Name值是正確的
而後這裏的controller就能夠設置這個角色了
沒有權限的時候訪問的是一個Account/AccessDenied這麼個路由
咱們應該作這麼個路由,當沒有權限的時候去訪問這個頁面。
修改權限被角色的訪問地址,客戶端這裏有一個選項
測試
調試
能夠把策略附加到action上,action也能夠有多個策略。這種比較靈活,如今這種方式用的比較多
看服務器端的用戶信息
咱們來定義FamilyName爲Smith而且lication也就是地址爲someWhere的這麼個策略
客戶端設置,首先要求,用戶必須是登錄的用戶
而後是必須包含這麼兩個Claim。
1是FamilyName是Smith
2是location的claim的值是somwhere
固然這裏也能夠設置對應多個值,這裏咱們測試先設置爲smith便可
服務端還須要設置用戶返回的信息
訪問api1資源的時候,這麼設置就會帶上這個location的claim
客戶端配置
運行
客戶端設置
修改成策略受權
再次測試只有知足策略的用戶才能訪問。
使用側錄的好處就是,直接能夠改策略的代碼不用,再修改controller這裏的代碼jwt
這樣這個類就寫完了。而後就是寫handler
新建類SmithInSomeWhereHandler
使用Alice用戶測試
條件沒有知足因此爲Fail
改用Bob用戶
條件都知足
能夠正常訪問
每一個Requirement能夠有多個handler,若是其中一個handler返回了成功其餘的handler都沒有返回失敗
中間件