Identity Server 4 - Hybrid Flow - Claims

前一篇 Identity Server 4 - Hybrid Flow - MVC客户端身份验证: https://www.cnblogs.com/cgzl/p/9253667.html

Claims

我不知道怎么样翻译这个词比较好, 所以我一般就不翻译了.

在前一篇文章里, MVC客户端配置身份认证的时候有这么一句话(Startup的ConfigureServices):

640?wx_fmt=png

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

官方文档是这样介绍的: “我们关闭了JWT的Claim 类型映射, 以便允许well-known claims.”

如果我把这句话删掉, 然后再看看User.Claims的类型和值:

640?wx_fmt=png

现在有些claim的类型与ID Token里面的类型名称是不一样, 也有一些claim不见了:

640?wx_fmt=png

 

而加上这句话之后, 现在User claim类型的名字就和ID Token里面一样了:

640?wx_fmt=png

 

再看一下ID Token:

640?wx_fmt=png

有一些claims并没有出现在User.Claims里面. 这是因为这个中间件默认情况下会过滤掉一些它认为我们不需要的claim, 例如nbf, amr等.

就先看下面这两种情况吧:

1. 避免claims被默认过滤掉

如果我想让中间件不要过滤掉nbf和, 也就是把nbf和amr从被过滤掉集合里移除, 就可以使用这个方法:

640?wx_fmt=png

然后再看About页面打印的UserClaims:

640?wx_fmt=png

这样nbf和amr就不会被过滤掉了(从过滤掉的集合移除了).

 

2. 删除某些Claims

假如说我这个MVC客户端不需要sid和idp, 那么我可以使用下面的方法:

 640?wx_fmt=png

这是一个扩展方法, 一定要注意它和Remove方法的区别.........

 

再次操作后, 可以看到这些Claims不见了:

640?wx_fmt=png

 

ClaimActions还有其他几个方法, 请自行探索.

 

用户信息端点 UserInfo Endpoint 

尽管ID Token里面可以包含很多用户的claims, 但是尽量让ID Token小一点比较好. 所以当MVC客户端需要更多用户信息的时候可以手动请求用户信息端点, 这样做也可以获得用户最新的其他信息.

UserInfo Endpoint的官方文档在这: http://openid.net/specs/openid-connect-core-1_0.html#UserInfo

它要求使用GET或者POST进行请求, 但建议使用GET. 此外请求还需要使用Access Token.

这是一个例子:

640?wx_fmt=png

成功请求的响应结果是一个JSON对象.

 

首先在IDP里面再添加一个email scope:

640?wx_fmt=png

然后在配置的Client里面添加这个scope:

640?wx_fmt=png

 

最后为TestUser添加email的claim:

640?wx_fmt=png

 

回到MVC客户端的Startup, 这里也需要添加email这个scope,

而且还要保证这个email不会出现在claims Identity里面, 这样我在请求用户信息端点的时候才会得到email而不是从User.Claims里面得到:

640?wx_fmt=png

 

再次操作后, 可以看到User.Claims里没有出现email:

640?wx_fmt=png

 

下面我需要手动发送请求到用户信息端点来获取其他信息:

identity sever 4的这部分文档在: https://identityserver4.readthedocs.io/en/release/endpoints/userinfo.html#identitymodel, https://github.com/IdentityModel/IdentityModel2

文档提到, 需要为MVC客户端安装IdentityModel这个库:

dotnet add package IdentityModel

随后, 我把获取用户email的代码还是放在About Action里:

640?wx_fmt=png

首先通过IDP的URI获得discovery document, 然后从中取出UserInfo端点, 从Cookie里得到access token, 并用access token从用户信息端点获得claims, 从这些claims里面取得email并传递到About.cshtml.

相应的修改一下About.html:

640?wx_fmt=png

 

重新操作后看About页面:

640?wx_fmt=png

 

对MVC客户端使用基于角色对授权

首先需要在IDP那里对两个用户添加role这个claim:

640?wx_fmt=png

分别是管理员角色和注册用户角色.

 

OpenID Connect并没有定义关于角色role相关的scope, 所以我还需要自定义一个scope:

640?wx_fmt=png

第一个参数是scope的名字, 第二个参数是scope的显示名, 第三个参数是它所包含的claim类型, 这里就是“role”.

 

然后还需要客户端允许请求“roles”这个scope:

640?wx_fmt=png

 

IDP这边配置完了, 下面是MVC客户端的配置, 打开MVC的startup, 添加“roles”这个scope:

640?wx_fmt=png

 

下面测试, 可以看到在同意页面确实请求了角色“roles”这个scope:

640?wx_fmt=png

 

然后同意后却无法从User.Claims里看到角色role 这个claim:

640?wx_fmt=png

这是因为ASP.NET默认对UserInfo返回的JSON数据里一些常用的顶层claim进行了映射, 以便它们能够出现在User.Claims里面.

我也只需要把JSON里面的role claim, 映射到User.Claims里即可:

640?wx_fmt=png

 

再次操作后, 就可以在User.Claims看到角色了:

640?wx_fmt=png

 

然后我便可以在MVC客户端的任意地方通过角色来控制用户的访问权限了, 例如:

640?wx_fmt=png

但是如何把role claim映射成ASP.NET Core MVC可以识别的角色Roles呢?

可以在MVC里这样配置:

640?wx_fmt=png

该参数主要是配置验证Token的一些东西, 然而它还可以指定客户端的Name 和 Role Claim的类型.

 

操作后用两个用户分别测试一下, Nick 管理员, 可以访问About:

640?wx_fmt=png

 

另一个用户, Dave 注册用户, 则不可以访问About:

640?wx_fmt=png

 

这说明角色已经被MVC客户端识别了.

 

但是对于Dave这个用户来说, 没有权限访问About时, 页面显示非常不友好, 所以下面解决这个问题.

首先建立一个AuthroizationController:

640?wx_fmt=png

 

然后建立相关的view:

640?wx_fmt=png

 

最后在Startup里面配置, 如果没有权限就跳转到这个Action上:

640?wx_fmt=png

 

再次操作后, Dave点击About后就会因为权限不足而跳转到该页面:

640?wx_fmt=png

 

今天先到这, 我自己几乎不用MVC, 我主要是做Web API的, 这部分的内容大部分来自官方文档和其他一些资料综合出来的.

代码: https://github.com/solenovex/Identity-Server-4-Tutorial-Code 02部分

相关文章:

  • 要用Identity Server 4 -- OAuth 2.0 超级简介

  • Identity Server 4 预备知识 -- OpenID Connect 简介

  • Identity Server 4 - Hybrid Flow - MVC客户端身份验证

原文地址https://www.cnblogs.com/cgzl/p/9268371.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320900.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图像处理作业第7次

图像处理作业第7次 1.请根据课本中Z变换的定义,证明如下结论。 (1)若x(n)x(n)x(n)的ZZZ变换为X(z)X(z)X(z),则(−1)nx(n)(-1)^nx(n)(−1)nx(n)的ZZZ变换为X(−z)X(-z)X(−z) 根据ZZZ变换的定义 X(z)∑x(n)z−n,∑(−1)nx(n)z−n∑x(n)(−z)−nX(−z)X(z…

【prim】【最小生成树】最优布线问题(ssl 1612)

最优布线问题 ssl 1612 题目大意: 求最小生成树 原题: 题目描述 学校有n台计算机,为了方便数据传输,现要将它们用数据线连接起来。两台计算机被连接是指它们之间有数据线连接。由于计算机所处的位置不同,因此不同…

P5304-[GXOI/GZOI2019]旅行者【最短路】

正题 题目链接:https://www.luogu.com.cn/problem/P5304 题目大意 nnn个点mmm条边的一张有向图,有kkk个关键点,求距离最短的一对关键点。 解题思路 我们能够O(nlog⁡n)O(n\log n)O(nlogn)的进行一个起点或多个起点同时的最短路,但是这题显然…

微软宣布ASP.NET Core 2.0正式支持OData标准

近日,OData 团队在微软开发者博客上宣布,ASP.NET Core 2.0 已正式支持 OData 标准,开发者现在可通过包管理器 NuGet 来获取 Microsoft.AspNetCore.OData 包。此软件包包含在使用 ASP.NET Core MVC 时创建 OData v4.0 端点以及支持 Web API 的…

P2710-数列【Splay】

正题 题目链接:https://www.luogu.com.cn/problem/P2710 题目大意 nnn个数,mmm次操作要求支持 插入若干个数删除某个位置开始的连续若干个数翻转一个区间修改一个区间为ttt求区间和输出一个位置的值询问一个区间的最大子段和 解题思路 用SplaySplaySplay维护&…

【并查集】【图论】【最小生成树】剑鱼行动(ssl 1618)

剑鱼行动 ssl 1618 题目大意: 求一个平面直角坐标系中的最小生成树 原题: 题目描述 给出N个点的坐标,对它们建立一个最小生成树,代价就是连接它们的路径的长度,现要求总长度最小。N的值在100以内,坐标…

图像处理作业4

图像处理作业4 1. 第二版课本习题4.21 本质没有区别,只将图片放置在中心,而周围填充0的个数不变时,不会影响结果。因为本质都是进行了周期延拓,使得尾部的信息不会被丢弃掉。相当于滤波前将图像进行了平移。需要注意的是&#x…

[译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了

园子里关于ASP.NET Core Web API的教程很多,但大多都是使用EFMysql或者EFMSSQL的文章。甚至关于ASP.NET Core Web API中使用DapperMysql组合的文章都很少,更别提OracelDapper组合的文章了,那么今天就带着大家一起翻译一篇国外大牛写的关于ASP…

一个c#开发的web绘流系统

本项目为Web版流程图绘图,兼容IE、FF、Chrome等各主流浏览器,提供了各类基础图形,至于如何应用及用来做什么就随各位了,常规的流程图及逻辑辅助、工作流等皆可胜任。本系统虽为开源项目,然精心调配开发测试&#xff0c…

【二进制】17倍

17倍 题目大意: 有一个二进制数,求它的17倍 原题: 题目描述: 在了解做软件开发可能赚很多的钱之后,农夫约翰也开了一家小的软件公司为客户写程序。约翰的第一个任务对他来说看起来相当简单:输入一个数N&#xff0…

图像处理作业第五次

第5次图像处理作业 1. 复习理解课本中最佳陷波滤波器进行图像恢复的过程,请推导出w(x,y)最优解的计算过程. 根据公式: σ21(2a1)(2b1)∑∑[g−wη−(gˉ−wηˉ)]2\sigma ^2 \frac{1}{(2a1)(2b1)}\sum\sum[g-w\eta - (\bar g-w\bar\eta)]^2σ2(2a1)(2b1)1​∑∑[g…

2020牛客国庆集训派对day8G-Shuffle Cards【Splay】

正题 题目链接:https://ac.nowcoder.com/acm/contest/7865/G 题目大意 nnn个数从1∼n1\sim n1∼n,mmm次拿出其中一段放到头部,求最终序列。 解题思路 用SplaySplaySplay拿出一段区间然后丢到头部就好了。 时间复杂度O(nlog⁡n)O(n\log n)O(nlogn) cod…

将系统分解为微服务的策略

几年前,Vladik Khononov和他的团队决定开始使用微服务,但是几个月后他们发现自己陷入了巨大的混乱之中。他在最近于伦敦Skills Matter举行的DDD eXchange 2018会议上指出,造成这一现象的原因在于,他们只专注于采用酷炫的新技术&am…

图像处理作业 第8次

图像处理作业 第8次 7.11 说明尺度函数ϕ(x)1,0.25≤x<0.75\phi(x)1 ,0.25 \le x\lt 0.75ϕ(x)1,0.25≤x<0.75并未满足多分辨率分析的第二个要求. ϕ1,0(x)2ϕ(2x)1\phi_{1,0}(x)\sqrt 2 \phi(2x)1ϕ1,0​(x)2​ϕ(2x)1 当且仅当满足0.125≤x<0.3750.125 \le x\lt 0…

【dfs】马蹄印

马蹄印 题目大意&#xff1a; 有一个只含括号的图&#xff0c;要你走一条路&#xff08;从左上角出发&#xff09;&#xff0c;使你走的路上的括号加在一起是先k个左括号再k个右括号组成的&#xff0c;要求k最大 原题&#xff1a; 题目描述&#xff1a; 虽然当奶牛贝里斯找…

P4852-yyf hates choukapai【单调队列优化dp】

正题 题目链接:https://www.luogu.com.cn/problem/P4852 题目大意 给出n,m,c,dn,m,c,dn,m,c,d&#xff0c;有n∗cmn*cmn∗cm张卡牌。进行nnn次连抽mmm次单抽&#xff0c;连抽连续ccc张卡牌会获得第一张卡牌的欧气值&#xff0c;单抽可以获得抽到卡牌的欧气值。不能连续进行dd…

P4317-花神的数论题【组合数学】

正题 题目链接:https://www.luogu.com.cn/problem/P4317 题目大意 定义sum(i)sum(i)sum(i)表示iii二进制下111的个数 求∏i1nsum(i)\prod_{i1}^nsum(i)i1∏n​sum(i) 解题思路 考虑计算有iii个111的有多少个数字。 对于nnn的每一个111&#xff0c;我们可以知道如果这一位为…

【暴力】排队的奶牛

排队的奶牛 题目大意&#xff1a; 有一个序列&#xff0c;要你删去序列中的一类相同的数&#xff0c;然后求最长的相同数字段的长度 原题&#xff1a; 题目描述 农夫约翰的N只奶牛排成了一条直线&#xff0c;每只奶牛都有一个特定的标识序号&#xff0c;从左到右第i只奶牛…

NOIP2019 Emiya家今天的饭

NOIP2019 Emiya家今天的饭 ACM退役选手远程口胡 csf如今真的是太菜了,最后16分的做法愣是想了一下午 考虑使用容斥方法: 1 采用动态规划,先求出在无限制情况下,安排kkk种烹饪方法总的方案数. 记dp2[i][j]dp2[i][j]dp2[i][j]表示已经考虑完前iii种烹饪方法,共做了jjj个菜的方…

.NET Core微服务之基于Ocelot+IdentityServer实现统一验证与授权

一、案例结构总览这里&#xff0c;假设我们有两个客户端&#xff08;一个Web网站&#xff0c;一个移动App&#xff09;&#xff0c;他们要使用系统&#xff0c;需要先向IdentityService进行Login以进行验证并获取Token&#xff0c;在IdentityService的验证过程中会访问数据库以…