前面的部分:

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. 大爽Python入门教程 0-2 什么是IDE?python选什么IDE好?

    大爽Python入门公开课教案 点击查看教程总目录 一 感受IDE 什么是IDE? 在这里,我并不想直接给出一个回答, 因为这个回答对初学者来说,可能有些抽象. 我想先带大家感受下IDE. 1 比较不 ...

  2. jenkins bat删除指定路径下的文件及文件夹

    最近在用jenkins集成,生成allure测试报告,但是每次生成的allure测试报告,都是上一次执行的痕迹.比如这次我只运行了100个用例,结果显示运行2000条,上一次运行的用例,时间也涵括了上 ...

  3. ajax - error

    ... <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title ...

  4. vue.js学习与实战笔记(2)

    驼峰式写法时需要注意的问题 学习到组件这一章时,由于没注意到vue中对于camelCased的解释,导致出错了都找不出来,后面发现 在使用驼峰式写法时,在使用模板的时候需要使用kebab-case命名 ...

  5. [luogu7116]微信步数

    先判定无解,当且仅当存在一个位置使得移动$n$步后没有结束且仍在原地 暴力枚举移动的步数,记$S_{i}$为移动$i$步(后)未离开范围的点个数,则恰好移动$i$步的人数为$S_{i-1}-S_{i} ...

  6. synchronized的一些理解

    1. 两个普通的synchronized package ThreadTest; import java.util.concurrent.TimeUnit; public class ThreadTe ...

  7. WC2021 云划水记

    Day -38 - 2459208(2020.12.24) CCF 发公告了,线上举办 hopping. 刚看到还纠结了一会儿,但想想还是报了.虽说是去摸鱼,打打暴力分就走人.但毕竟有牌和没牌也是不一 ...

  8. oracle 将电话号码中间4位数以星号*代替

    select replace('17665312355',substr('17665312355',4,4),'****')  as phone,                       #类似E ...

  9. Excel-给出指定数值的日期 date()

    DATE函数 函数名称:DATE 主要功能:给出指定数值的日期. 使用格式:DATE(year,month,day) 参数说明:year为指定的年份数值(小于9999):month为指定的月份数值(可 ...

  10. JuiceFS 数据读写流程详解

    对于文件系统而言,其读写的效率对整体的系统性能有决定性的影响,本文我们将通过介绍 JuiceFS 的读写请求处理流程,让大家对 JuiceFS 的特性有更进一步的了解. 写入流程 JuiceFS 对大 ...