Identity Server 4 从入门到落地(九)—— 客户端User和Role的解析
前面的部分:
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的解析的更多相关文章
- Identity Server 4 从入门到落地(十)—— 编写可配置的客户端和Web Api
前面的部分: Identity Server 4 从入门到落地(一)-- 从IdentityServer4.Admin开始 Identity Server 4 从入门到落地(二)-- 理解授权码模式 ...
- Identity Server 4 从入门到落地(十一)—— Docker部署
前面的部分: Identity Server 4 从入门到落地(一)-- 从IdentityServer4.Admin开始 Identity Server 4 从入门到落地(二)-- 理解授权码模式 ...
- Identity Server 4 从入门到落地(十二)—— 使用Nginx集成认证服务
前面的部分: Identity Server 4 从入门到落地(一)-- 从IdentityServer4.Admin开始 Identity Server 4 从入门到落地(二)-- 理解授权码模式 ...
- Identity Server 4 从入门到落地(五)—— 使用Ajax访问Web Api
前面的部分: Identity Server 4 从入门到落地(一)-- 从IdentityServer4.Admin开始 Identity Server 4 从入门到落地(二)-- 理解授权码模式 ...
- Identity Server 4 从入门到落地(四)—— 创建Web Api
前面的部分: Identity Server 4 从入门到落地(一)-- 从IdentityServer4.Admin开始 Identity Server 4 从入门到落地(二)-- 理解授权码模式 ...
- Identity Server 4 从入门到落地(六)—— 简单的单页面客户端
前面的部分: Identity Server 4 从入门到落地(一)-- 从IdentityServer4.Admin开始 Identity Server 4 从入门到落地(二)-- 理解授权码模式 ...
- Identity Server 4 从入门到落地(七)—— 控制台客户端
前面的部分: Identity Server 4 从入门到落地(一)-- 从IdentityServer4.Admin开始 Identity Server 4 从入门到落地(二)-- 理解授权码模式 ...
- Identity Server 4 从入门到落地(八)—— .Net Framework 客户端
前面的部分: Identity Server 4 从入门到落地(一)-- 从IdentityServer4.Admin开始 Identity Server 4 从入门到落地(二)-- 理解授权码模式 ...
- Identity Server 4 从入门到落地(三)—— 创建Web客户端
书接上回,我们已经搭建好了基于Identity Server 4的认证服务和管理应用(如果还没有搭建,参看本系列前两部分,相关代码可以从github下载:https://github.com/zhen ...
随机推荐
- Redis | 第一部分:数据结构与对象 上篇《Redis设计与实现》
目录 前言 1. 简单动态字符串 1.1 SDS的定义 1.2 空间预分配与惰性空间释放 1.3 SDS的API 2. 链表 2.1 链表与节点的定义 2.2 链表的API 3. 字典 3.1 哈希表 ...
- [hdu6578]Blank
状态f[i][j][k][l]表示前i个数,四种数的最后一次出现的位置分别是i.j.k和l(i>j>k>l),判断所有第右端点为i的区间是否满足此要求(不满足重置为0),考虑第i+1 ...
- [atARC070E]NarrowRectangles
记$len_{i}=r_{i}-l_{i}$,即第$i$个区间的长度 用$f_{i,j}$表示前$i$个区间合法,第$i$个区间位于$[j,j+len_{i}]$的最小代价,暴力dp的时间复杂度为$o ...
- [atARC094D]Worst Case
首先,容易证明满足条件的$ip_{i}$必然是一个前缀 将其看成一张二分图,$i$向满足$ip_{i}<xy$的$p_{i}$连边,即找到一个前缀满足其有完美匹配 二分枚举前缀长度$k$,根据h ...
- [atARC058F]Lroha Loves Strings
贪心,求出前$i$个字符串所能组成的字典序最小的字符串$ans$(特别的,这里的字典序有$ab>abc$),同时保证剩下的长度能通过$l_{i+1},...,l_{n}$拼接 考虑插入一个字符串 ...
- 深度学习,机器学习神器,白嫖免费GPU
深度学习,机器学习神器,白嫖免费GPU! 最近在学习计算机视觉,自己的小本本没有那么高的算力,层级尝试过Google的Colab,以及移动云的GPU算力,都不算理想.如果数据集比较小,可以试试Cola ...
- 高并发异步解耦利器:RocketMQ究竟强在哪里?
上篇文章消息队列那么多,为什么建议深入了解下RabbitMQ?我们讲到了消息队列的发展史: 并且详细介绍了RabbitMQ,其功能也是挺强大的,那么,为啥又要搞一个RocketMQ出来呢?是重复造轮子 ...
- python中else的三种用法
与if搭配 要么--不然-- num = input("输入一个数字") if(num % 2 == 0): print("偶数") else: print(& ...
- 雪花算法对System.currentTimeMillis()优化真的有用么?
前面已经讲过了雪花算法,里面使用了System.currentTimeMillis()获取时间,有一种说法是认为System.currentTimeMillis()慢,是因为每次调用都会去跟系统打一次 ...
- jQuery源码中的赌博网站
前言 jQuery源码中有赌博网站? 起因是公司发的一份自查文件,某银行在日常安全运营过程中发现在部分jQuery源码中存在赌博和黄色网站链接. 链接分为好几个: www.cactussoft.cn ...