前面的部分:

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页面中增加一些代码,显示用户的名称并判断用户是否属于某个角色:


<span>@User.Identity.Name</span> @if(User.IsInRole("AdminRole"))
{
<span>AdminUser</span>
}else
{
<span>NoAdmin</span> }

运行客户端,结果发现,没有如我们想象中那样工作:用户名称没有显示出来,角色判断也不正确。我们在上面的代码中设一下断点,看一下User内部的变量:



这里可以看到两个属性:NameClaimType和RoleClaimType,这两个属性说明Identity的Name和Role对应的Claim,我们Name对应的Claim Type是name,不是缺省设置中的“http://schemas/xmlsoap.org/ws/2005/05/identity/claims/name”,我们需要修改一下这个设置,在program.cs中增加下面代码:

        options.TokenValidationParameters.RoleClaimType = "role";
options.TokenValidationParameters.NameClaimType = "name";

再次运行,用户名称可以显示了,但角色判断仍然不正确。我们回头看一下返回的claims,发现没有角色,这就有两种可能,一种是角色没有发送过来,还有一种可能就是没有解析。我们先排除第一种可能,登录到认证服务管理进行检查。首先检查一下client的scope中是否包含了role,我们在profile中发现已经设置了role:

然后检查一下用户是否设置了角色:



这一项也正常,那么问题应该出在客户端。在网上搜了一下,发现需要在代码中增加映射,代码如下:

        options.ClaimActions.MapJsonKey("role", "role");

再次运行程序,这次工作正常了。

需要说明一下,对于其它需要增加到Claim中的自定义项,也需要使用MapJsonKey或者MapUniqueJsonKey进行映射,比如,我们增加一个用户自定义的属性nickname,可以作为claim增加到名称为profile的scope中,如果在客户端获取这个属性,需要增加映射如下:

        options.ClaimActions.MapUniqueJsonKey("nickname", "nickname");

MapJsonKey和MapUniqueJsonKey两者的区别是,MapUniqueJsonKey会把多个相同的Claim合并为数组。比如,如果把上面的options.ClaimActions.MapJsonKey("role", "role");改为options.ClaimActions.MapUniqueJsonKey("role", "role");返回的claim 如下:



这种情况下多个role被合并到一起,作为一个数组存在,这种情况下IsInRole将不起作用。

到此,为客户端开发做的准备差不多了,下一步我们需要把代码中写死的配置项移动到配置文件中去。

Identity Server 4 从入门到落地(九)—— 客户端User和Role的解析的更多相关文章

  1. Identity Server 4 从入门到落地(十)—— 编写可配置的客户端和Web Api

    前面的部分: Identity Server 4 从入门到落地(一)-- 从IdentityServer4.Admin开始 Identity Server 4 从入门到落地(二)-- 理解授权码模式 ...

  2. Identity Server 4 从入门到落地(十一)—— Docker部署

    前面的部分: Identity Server 4 从入门到落地(一)-- 从IdentityServer4.Admin开始 Identity Server 4 从入门到落地(二)-- 理解授权码模式 ...

  3. Identity Server 4 从入门到落地(十二)—— 使用Nginx集成认证服务

    前面的部分: Identity Server 4 从入门到落地(一)-- 从IdentityServer4.Admin开始 Identity Server 4 从入门到落地(二)-- 理解授权码模式 ...

  4. Identity Server 4 从入门到落地(五)—— 使用Ajax访问Web Api

    前面的部分: Identity Server 4 从入门到落地(一)-- 从IdentityServer4.Admin开始 Identity Server 4 从入门到落地(二)-- 理解授权码模式 ...

  5. Identity Server 4 从入门到落地(四)—— 创建Web Api

    前面的部分: Identity Server 4 从入门到落地(一)-- 从IdentityServer4.Admin开始 Identity Server 4 从入门到落地(二)-- 理解授权码模式 ...

  6. Identity Server 4 从入门到落地(六)—— 简单的单页面客户端

    前面的部分: Identity Server 4 从入门到落地(一)-- 从IdentityServer4.Admin开始 Identity Server 4 从入门到落地(二)-- 理解授权码模式 ...

  7. Identity Server 4 从入门到落地(七)—— 控制台客户端

    前面的部分: Identity Server 4 从入门到落地(一)-- 从IdentityServer4.Admin开始 Identity Server 4 从入门到落地(二)-- 理解授权码模式 ...

  8. Identity Server 4 从入门到落地(八)—— .Net Framework 客户端

    前面的部分: Identity Server 4 从入门到落地(一)-- 从IdentityServer4.Admin开始 Identity Server 4 从入门到落地(二)-- 理解授权码模式 ...

  9. Identity Server 4 从入门到落地(三)—— 创建Web客户端

    书接上回,我们已经搭建好了基于Identity Server 4的认证服务和管理应用(如果还没有搭建,参看本系列前两部分,相关代码可以从github下载:https://github.com/zhen ...

随机推荐

  1. VLAN实验

    VLAN实验 如图所示:图中共有四个广播域,左边逻辑的分为两个广播域,右边也是逻辑的分为两个广播域, 配置顺序先配置交换机,在配置路由器 SW1 配置: 1.首先创建vlan [sw1]vlan ba ...

  2. 大爽Python入门教程 0-1 安装python

    大爽Python入门公开课教案 点击查看教程总目录 一 如何找到下载地址并下载 下面展示找到下载地址的方法步骤 嫌步骤太慢可直接跳到第4步, 查看详细下载地址 使用搜索引擎搜索python 打开搜索结 ...

  3. [hdu5379]Mahjong tree

    一棵子树的每一个儿子相当于划分一个区间,同时这些区间一定要存在一个点连续(直接的儿子),因此每一棵树最多只有两个儿子存在子树,并且这两个儿子所分到的区间一定是该区间最左和最右两段,所以ans*=(so ...

  4. 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明

    目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...

  5. Linux终端使用aplay播放wav

    Linux终端使用aplay播放wav aplay是一个ALSA的声卡命令行soundfile录音机的驱动程序. 在linux下可以使用下面命令来查看用法: man aplay 所以可以使用来播放.w ...

  6. AI剪辑和自定义UI,打造更智能的剪辑体验

    为满足开发者构建高效的应用内视频编辑能力,7月的HMS Core 6.0 推出了视频编辑服务(Video Editor Kit),一站式的视频处理能力获得了积极反响.同时,我们也关注到开发者需要集成丰 ...

  7. Codeforces 1109F - Sasha and Algorithm of Silence's Sounds(LCT)

    Codeforces 题面传送门 & 洛谷题面传送门 讲个笑话,这题是 2020.10.13 dxm 讲题时的一道例题,而我刚好在一年后的今天,也就是 2021.10.13 学 LCT 时做到 ...

  8. 洛谷 P3700 - [CQOI2017]小Q的表格(找性质+数论)

    洛谷题面传送门 又是一道需要一些观察的数论 hot tea-- 注意到题目中 \(b·f(a,a+b)=(a+b)·f(a,b)\) 这个柿子长得有点像求解 \(\gcd\) 的辗转相除法,因此考虑从 ...

  9. 毕业设计之zabbix集合

    lnmp环境请查看https://www.cnblogs.com/betterquan/p/12285956.html 但是!!!注意php的编译: https://www.zabbix.com/do ...

  10. 33. Implement strStr()

    http://blog.csdn.net/justdoithai/article/details/51287649 理解与分析 Implement strStr() My Submissions Qu ...