1. 程式人生 > >Identity Server 4

Identity Server 4

Claims

我不知道怎麼樣翻譯這個詞比較好, 所以我一般就不翻譯了.

在前一篇文章裡, MVC客戶端配置身份認證的時候有這麼一句話(Startup的ConfigureServices):

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

官方文件是這樣介紹的: “我們關閉了JWT的Claim 型別對映, 以便允許well-known claims.”

如果我把這句話刪掉, 然後再看看User.Claims的型別和值:

現在有些claim的型別與ID Token裡面的型別名稱是不一樣, 也有一些claim不見了:

而加上這句話之後, 現在User claim型別的名字就和ID Token裡面一樣了:

再看一下ID Token:

有一些claims並沒有出現在User.Claims裡面. 這是因為這個中介軟體預設情況下會過濾掉一些它認為我們不需要的claim, 例如nbf, amr等.

就先看下面這兩種情況吧:

1. 避免claims被預設過濾掉

如果我想讓中介軟體不要過濾掉nbf和, 也就是把nbf和amr從被過濾掉集合裡移除, 就可以使用這個方法:

然後再看About頁面列印的UserClaims:

這樣nbf和amr就不會被過濾掉了(從過濾掉的集合移除了).

2. 刪除某些Claims

假如說我這個MVC客戶端不需要sid和idp, 那麼我可以使用下面的方法:

 

這是一個擴充套件方法, 一定要注意它和Remove方法的區別.........

再次操作後, 可以看到這些Claims不見了:

ClaimActions還有其他幾個方法, 請自行探索.

使用者資訊端點 UserInfo Endpoint 

儘管ID Token裡面可以包含很多使用者的claims, 但是儘量讓ID Token小一點比較好. 所以當MVC客戶端需要更多使用者資訊的時候可以手動請求使用者資訊端點, 這樣做也可以獲得使用者最新的其他資訊.

它要求使用GET或者POST進行請求, 但建議使用GET. 此外請求還需要使用Access Token.

這是一個例子:

成功請求的響應結果是一個JSON物件.

首先在IDP裡面再新增一個email scope:

然後在配置的Client裡面新增這個scope:

最後為TestUser新增email的claim:

回到MVC客戶端的Startup, 這裡也需要新增email這個scope,

而且還要保證這個email不會出現在claims Identity裡面, 這樣我在請求使用者資訊端點的時候才會得到email而不是從User.Claims裡面得到:

再次操作後, 可以看到User.Claims裡沒有出現email:

下面我需要手動傳送請求到使用者資訊端點來獲取其他資訊:

文件提到, 需要為MVC客戶端安裝IdentityModel這個庫:

dotnet add package IdentityModel

隨後, 我把獲取使用者email的程式碼還是放在About Action裡:

首先通過IDP的URI獲得discovery document, 然後從中取出UserInfo端點, 從Cookie裡得到access token, 並用access token從使用者資訊端點獲得claims, 從這些claims裡面取得email並傳遞到About.cshtml.

相應的修改一下About.html:

重新操作後看About頁面:

對MVC客戶端使用基於角色對授權

首先需要在IDP那裡對兩個使用者新增role這個claim:

分別是管理員角色和註冊使用者角色.

OpenID Connect並沒有定義關於角色role相關的scope, 所以我還需要自定義一個scope:

第一個引數是scope的名字, 第二個引數是scope的顯示名, 第三個引數是它所包含的claim型別, 這裡就是“role”.

然後還需要客戶端允許請求“roles”這個scope:

IDP這邊配置完了, 下面是MVC客戶端的配置, 開啟MVC的startup, 新增“roles”這個scope:

下面測試, 可以看到在同意頁面確實請求了角色“roles”這個scope:

然後同意後卻無法從User.Claims裡看到角色role 這個claim:

這是因為ASP.NET預設對UserInfo返回的JSON資料裡一些常用的頂層claim進行了對映, 以便它們能夠出現在User.Claims裡面.

我也只需要把JSON裡面的role claim, 對映到User.Claims裡即可:

再次操作後, 就可以在User.Claims看到角色了:

然後我便可以在MVC客戶端的任意地方通過角色來控制使用者的訪問許可權了, 例如:

但是如何把role claim對映成ASP.NET Core MVC可以識別的角色Roles呢?

可以在MVC裡這樣配置:

該引數主要是配置驗證Token的一些東西, 然而它還可以指定客戶端的Name 和 Role Claim的型別.

操作後用兩個使用者分別測試一下, Nick 管理員, 可以訪問About:

另一個使用者, Dave 註冊使用者, 則不可以訪問About:

這說明角色已經被MVC客戶端識別了.

但是對於Dave這個使用者來說, 沒有許可權訪問About時, 頁面顯示非常不友好, 所以下面解決這個問題.

首先建立一個AuthroizationController:

然後建立相關的view:

最後在Startup裡面配置, 如果沒有許可權就跳轉到這個Action上:

再次操作後, Dave點選About後就會因為許可權不足而跳轉到該頁面:

今天先到這, 我自己幾乎不用MVC, 我主要是做Web API的, 這部分的內容大部分來自官方文件和其他一些資料綜合出來的.

相關推薦

學習Identity Server 4的預備知識

發布 開發 簡單的 密碼 是否 alt imp load 通信 我要使用asp.net core 2.0 web api 搭建一個基礎框架並立即應用於一個實際的項目中去. 這裏需要使用identity server 4 做單點登陸. 下面就簡單學習一下相關的預備知識. 基於

使用Identity Server 4建立Authorization Server (2)

可能 參數 ecif fig register startup 類型 cal mat 第一部分: http://www.cnblogs.com/cgzl/p/7780559.html 第一部分主要是建立了一個簡單的Identity Server. 接下來繼續: 建立Web

使用Identity Server 4建立Authorization Server (5)

連接字符串 mapr path 框架 ise network edit setting pin 預備知識: http://www.cnblogs.com/cgzl/p/7746496.html 第一部分: http://www.cnblogs.com/cgzl/p/7780

使用Identity Server 4建立Authorization Server (6) - js(angular5) 客戶端

include 節點 ogr 包含 發的 for icon ets list 預備知識: http://www.cnblogs.com/cgzl/p/7746496.html 第一部分: http://www.cnblogs.com/cgzl/p/7780559.html

要用Identity Server 4 -- OAuth 2.0 超級簡介

分隔 理解 大小 很多 應用程序 identity 復制 字符串 返回 OAuth 2.0 簡介 OAuth有一些定義: OAuth 2.0是一個委托協議, 它可以讓那些控制資源的人允許某個應用以代表他們來訪問他們控制的資源, 註意是代表這些人, 而不是假冒或模仿這些人

Identity Server 4 - Hybrid Flow - 保護API資源

還需 defaults rest 兩個 ade die tar try 意思 這個系列文章介紹的是Identity Server 4 的 Hybrid Flow, 前兩篇文章介紹了如何保護MVC客戶端, 本文介紹如何保護API資源. 保護MVC客戶端的文章: https:

eShopOnContainers 看微服務③:Identity Service OAuth 2.0 簡介 OpenID Connect 簡介 Identity Server 4 eShopOnContainers 知多少[3]:Identity microservice

引言 通常,服務所公開的資源和 API 必須僅限受信任的特定使用者和客戶端訪問。那進行 API 級別信任決策的第一步就是身份認證——確定使用者身份是否可靠。 在微服務場景中,身份認證通常統一處理。一般有兩種實現形式: 基於API 閘道器中心化認證:要求客戶端必須都通過閘道器訪問微服務。(這就要求

學習Identity Server 4的預備知識 (誤刪, 重補)

我要使用asp.net core 2.0 web api 搭建一個基礎框架並立即應用於一個實際的專案中去. 這裡需要使用identity server 4 做單點登陸. 下面就簡單學習一下相關的預備知識. 基於Token的安全驗證體系 這個比較簡單, 簡單來說就是為了證明我們有訪問許可權, 我們首先需

Identity Server 4 (JWKS 端點和 RS256 演算法) 來保護 Python web api

目前正在使用asp.net core 2.0 (主要是web api)做一個專案, 其中一部分功能需要使用js客戶端呼叫python的pandas, 所以需要建立一個python 的 rest api, 我暫時選用了hug, 官網在這: http://www.hug.rest/. 目前專案使用的是ide

使用Identity Server 4建立Authorization Server (3)

上一部分簡單的弄了個web api 並通過Client_Credentials和ResourceOwnerPassword兩種方式獲取token然後進行api請求. 這次講一下Authentication 身份驗證 (而Authorization是授權, 注意區分), 使用的是OpenIdCon

使用Identity Server 4建立Authorization Server (1)

官方文件很詳細的. 使用OAuth可以更安全, 這裡我們的authorization server和web api 以及網站將分別獨立執行.  建立authorization server 建立asp.net core 專案使用空模板. 專案建立後, 執行方式改為使用控制檯執行而不是IISEx

Identity Server 4

Claims 我不知道怎麼樣翻譯這個詞比較好, 所以我一般就不翻譯了. 在前一篇文章裡, MVC客戶端配置身份認證的時候有這麼一句話(Startup的ConfigureServices): JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Cl

Identity Server 4 預備知識 -- OAuth 2.0 簡介

OAuth 2.0 簡介 OAuth有一些定義: OAuth 2.0是一個委託協議, 它可以讓那些控制資源的人允許某個應用以代表他們來訪問他們控制的資源, 注意是代表這些人, 而不是假冒或模仿這些人. 這個應用從資源的所有者那裡獲得到授權(Authorization)和access token, 隨後就可

Identity Server 4 預備知識 -- OpenID Connect 簡介

這篇文章我要介紹一下 OpenID Connect. OAuth 2.0 不是身份認證協議 OAuth 2.0 不是身份認證(Authentication)協議. 為什麼有人會認為OAuth 2.0具有身份認證的功能? 這是因為OAuth2經常作為身份認證(Authentication)協議的一部分來

使用Identity Server 4建立Authorization Server (4)

上一篇講了使用OpenId Connect進行Authentication. 下面講 Hybrid Flow和Offline Access 目前我們解決方案裡面有三個專案 Authorization Server, Web api和Mvc Client. 在現實世界中, 他們可能都在不同

第44章 添加新協議 - Identity Server 4 中文文檔(v1.0.0)

iges author 重用 sign tsig dds mode 上下文 bool 除了對OpenID Connect和OAuth 2.0的內置支持之外,IdentityServer4還允許添加對其他協議的支持。 您可以將這些附加協議端點添加為中間件或使用例如MVC控制器

第47章 授權端點(Authorize Endpoint) - Identity Server 4 中文文檔(v1.0.0)

Nid str ons 響應 challenge redirect 授權 轉發 必須 授權端點可用於通過瀏覽器請求令牌或授權碼。此過程通常涉及最終用戶的身份驗證和可選的同意。 註意 IdentityServer支持OpenID Connect和OAuth 2.0授權請求參

第41章 CORS - Identity Server 4 中文文檔(v1.0.0)

應用程序 lec 裝飾 conf tst client 模式 ria logger 第41章 CORS IdentityServer中的許多端點將通過基於JavaScript的客戶端的Ajax調用進行訪問。鑒於IdentityServer最有可能托管在與這些客戶端不同的源上

第42章 發現(discovery) - Identity Server 4 中文文檔(v1.0.0)

開頭 option entity .sh 情況下 cover 我們 setting tom 可以在*https://baseaddress/.well-known/openid-configuration*找到發現文檔。它包含有關IdentityServer的端點,密鑰材料

第45章 工具 - Identity Server 4 中文文檔(v1.0.0)

簡單 可能 控制 syn back 集合 有效 文檔 new 該IdentityServerTools是為IdentityServer編寫擴展代碼時,你可能需要有效的內部工具的集合。要使用它,請將其註入代碼,例如控制器: public MyController(Identi