前面的部分:

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. Effective C++ 总结笔记(一)

    一.让自己习惯C++ 01.视C++为一个语言联邦 c++是多重范型编程 语言,视c++包括4种次语言: 1:C 2:Object-Oreinted C++: 3:Template C++: 4:ST ...

  2. OPA-Gatekeeper实验:对特定用户的更新时间窗口做限制

    实验目的 OPA-Gatekeeper可以在Kubernetes 中,通过策略来实现一些额外的管理.安全方面的限制,例如:限制特定用户在 Namespace 中的行为权限 本次实验将在test命名空间 ...

  3. ASP.NET Core 学习笔记 第五篇 ASP.NET Core 中的选项

    前言 还记得上一篇文章中所说的配置吗?本篇文章算是上一篇的延续吧.在 .NET Core 中读取配置文件大多数会为配置选项绑定一个POCO(Plain Old CLR Object)对象,并通过依赖注 ...

  4. vue 3 学习笔记 (六)——watch 、watchEffect 新用法

    选项式API与之前写法相同,本篇文章主要通过 Options API 和 Composition API 对比 watch 的使用方法,让您快速掌握 vue3 中 watch 新用法.建议收藏! 一. ...

  5. freeswitch verto communicator客户端

    概述 我们在web客户端使用sip协议时用的比较多的是sipml5库和jssip库. 但是sip协议比较重,又复杂,所以freeswitch内部就自定义了一个verto协议,方便在web页面上使用音视 ...

  6. Kubernetes Deployment 最佳实践

    零.示例 首先给出一个 Deployment+HPA+ PodDisruptionBudget 的完整 demo,后面再详细介绍其中的每一个部分: apiVersion: apps/v1 kind: ...

  7. flutter第一课

    网上搜到有一个8小时体验flutter的教程,感觉可以尝试一个hello world出来:https://www.jianshu.com/p/9aaabc60d8af 官网下载很慢,可以使用镜像下载, ...

  8. 7.2 k8s 基于PV、PVC搭建zookeeper 3节点集群

    1.PV,PVC介绍 1.1.StorageClass & PV & PVC关系图 Volumes 是最基础的存储抽象,其支持多种类型,包括本地存储.NFS.FC以及众多的云存储,我们 ...

  9. 进击的 Ansible(二):如何快速搞定生产环境 Ansible 项目布局?

    Tips:与前文 <进击的 Ansible(一):Ansible 快速入门> 一样,本文使用的 Ansible 版本 2.5.4,项目演示环境 MacOS.由于 Ansible 项目开发活 ...

  10. python14异常处理

    def test_div(num1,num2): return num1 / num2 if __name__ == "__main__": try: print(test_div ...