天天看點

Identity Server 4 從入門到落地(九)—— 用戶端User和Role的解析

修改用戶端,使用戶端程式可使用ClaimsPrincipal擷取使用者名和進行權限判斷。

前面的部分:

Identity Server 4 從入門到落地(一)—— 從IdentityServer4.Admin開始

Identity Server 4 從入門到落地(二)—— 了解授權碼模式

Identity Server 4 從入門到落地(三)—— 建立Web用戶端

Identity Server 4 從入門到落地(四)—— 建立Web Api

Identity Server 4 從入門到落地(五)—— 使用Ajax 通路 Web Api

Identity Server 4 從入門到落地(六)—— 簡單的單頁面用戶端

Identity Server 4 從入門到落地(七)—— 控制台用戶端

Identity Server 4 從入門到落地(八)—— .Net Framework 用戶端

認證服務和管理的github位址: https://github.com/zhenl/IDS4Admin

用戶端及web api示例代碼的github位址:https://github.com/zhenl/IDS4ClientDemo

前面我們試驗了認證服務的各種用戶端,到現在似乎一切正常,下一步需要為進一步開發做準備。我們要改造現有的應用,将現有的本地驗證改為認證服務,同時確定現有功能不受影響。現在,我們要模拟現有的應用功能,看在使用認證服務的情況下是否還能正常工作。在現有的應用中,使用基于ClaimsPrincipal的User對象擷取使用者資料并判斷權限,比如在RazorPage中,使用User.Identity.Name擷取登入使用者名,使用User.IsInRole來判斷使用者是否在某個角色中,我們希望這些代碼不需要改動。我們在最初的Web用戶端程式中增加一些代碼來模拟這些功能。

在Index頁面中增加一些代碼,顯示使用者的名稱并判斷使用者是否屬于某個角色:

運作用戶端,結果發現,沒有如我們想象中那樣工作:使用者名稱沒有顯示出來,角色判斷也不正确。我們在上面的代碼中設一下斷點,看一下User内部的變量:

Identity Server 4 從入門到落地(九)—— 用戶端User和Role的解析

這裡可以看到兩個屬性:NameClaimType和RoleClaimType,這兩個屬性說明Identity的Name和Role對應的Claim,我們Name對應的Claim Type是name,不是預設設定中的“http://schemas/xmlsoap.org/ws/2005/05/identity/claims/name”,我們需要修改一下這個設定,在program.cs中增加下面代碼:

再次運作,使用者名稱可以顯示了,但角色判斷仍然不正确。我們回頭看一下傳回的claims,發現沒有角色,這就有兩種可能,一種是角色沒有發送過來,還有一種可能就是沒有解析。我們先排除第一種可能,登入到認證服務管理進行檢查。首先檢查一下client的scope中是否包含了role,我們在profile中發現已經設定了role:

Identity Server 4 從入門到落地(九)—— 用戶端User和Role的解析

然後檢查一下使用者是否設定了角色:

Identity Server 4 從入門到落地(九)—— 用戶端User和Role的解析

這一項也正常,那麼問題應該出在用戶端。在網上搜了一下,發現需要在代碼中增加映射,代碼如下:

再次運作程式,這次工作正常了。

需要說明一下,對于其它需要增加到Claim中的自定義項,也需要使用MapJsonKey或者MapUniqueJsonKey進行映射,比如,我們增加一個使用者自定義的屬性nickname,可以作為claim增加到名稱為profile的scope中,如果在用戶端擷取這個屬性,需要增加映射如下:

MapJsonKey和MapUniqueJsonKey兩者的差別是,MapUniqueJsonKey會把多個相同的Claim合并為數組。比如,如果把上面的options.ClaimActions.MapJsonKey("role", "role");改為options.ClaimActions.MapUniqueJsonKey("role", "role");傳回的claim 如下:

Identity Server 4 從入門到落地(九)—— 用戶端User和Role的解析

這種情況下多個role被合并到一起,作為一個數組存在,這種情況下IsInRole将不起作用。

到此,為用戶端開發做的準備差不多了,下一步我們需要把代碼中寫死的配置項移動到配置檔案中去。

本文來自部落格園,作者:尋找無名的特質,轉載請注明原文連結:https://www.cnblogs.com/zhenl/p/15660567.html