Identity Server 4 - Hybrid Flow - Claims
前一篇 Identity Server 4 - Hybrid Flow - MVC客户端身份验证: https://www.cnblogs.com/cgzl/p/9253667.html
Claims
我不知道怎么样翻译这个词比较好, 所以我一般就不翻译了.
在前一篇文章里, MVC客户端配置身份认证的时候有这么一句话(Startup的ConfigureServices):
官方文档是这样介绍的: “我们关闭了JWT的Claim 类型映射, 以便允许well-known claims.”
如果我把这句话删掉, 然后再看看User.Claims的类型和值:
现在有些claim的类型与ID Token里面的类型名称是不一样, 也有一些claim不见了:
而加上这句话之后, 现在User claim类型的名字就和ID Token里面一样了:
再看一下ID Token:
有一些claims并没有出现在User.Claims里面. 这是因为这个中间件默认情况下会过滤掉一些它认为我们不需要的claim, 例如nbf, amr等.
就先看下面这两种情况吧:
1. 避免claims被默认过滤掉
如果我想让中间件不要过滤掉nbf和, 也就是把nbf和amr从被过滤掉集合里移除, 就可以使用这个方法:
然后再看About页面打印的UserClaims:
这样nbf和amr就不会被过滤掉了(从过滤掉的集合移除了).
2. 删除某些Claims
假如说我这个MVC客户端不需要sid和idp, 那么我可以使用下面的方法:
这是一个扩展方法, 一定要注意它和Remove方法的区别.........
再次操作后, 可以看到这些Claims不见了:
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.
这是一个例子:
成功请求的响应结果是一个JSON对象.
首先在IDP里面再添加一个email scope:
然后在配置的Client里面添加这个scope:
最后为TestUser添加email的claim:
回到MVC客户端的Startup, 这里也需要添加email这个scope,
而且还要保证这个email不会出现在claims Identity里面, 这样我在请求用户信息端点的时候才会得到email而不是从User.Claims里面得到:
再次操作后, 可以看到User.Claims里没有出现email:
下面我需要手动发送请求到用户信息端点来获取其他信息:
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里:
首先通过IDP的URI获得discovery document, 然后从中取出UserInfo端点, 从Cookie里得到access token, 并用access token从用户信息端点获得claims, 从这些claims里面取得email并传递到About.cshtml.
相应的修改一下About.html:
重新操作后看About页面:
对MVC客户端使用基于角色对授权
首先需要在IDP那里对两个用户添加role这个claim:
分别是管理员角色和注册用户角色.
OpenID Connect并没有定义关于角色role相关的scope, 所以我还需要自定义一个scope:
第一个参数是scope的名字, 第二个参数是scope的显示名, 第三个参数是它所包含的claim类型, 这里就是“role”.
然后还需要客户端允许请求“roles”这个scope:
IDP这边配置完了, 下面是MVC客户端的配置, 打开MVC的startup, 添加“roles”这个scope:
下面测试, 可以看到在同意页面确实请求了角色“roles”这个scope:
然后同意后却无法从User.Claims里看到角色role 这个claim:
这是因为ASP.NET默认对UserInfo返回的JSON数据里一些常用的顶层claim进行了映射, 以便它们能够出现在User.Claims里面.
我也只需要把JSON里面的role claim, 映射到User.Claims里即可:
再次操作后, 就可以在User.Claims看到角色了:
然后我便可以在MVC客户端的任意地方通过角色来控制用户的访问权限了, 例如:
但是如何把role claim映射成ASP.NET Core MVC可以识别的角色Roles呢?
可以在MVC里这样配置:
该参数主要是配置验证Token的一些东西, 然而它还可以指定客户端的Name 和 Role Claim的类型.
操作后用两个用户分别测试一下, Nick 管理员, 可以访问About:
另一个用户, Dave 注册用户, 则不可以访问About:
这说明角色已经被MVC客户端识别了.
但是对于Dave这个用户来说, 没有权限访问About时, 页面显示非常不友好, 所以下面解决这个问题.
首先建立一个AuthroizationController:
然后建立相关的view:
最后在Startup里面配置, 如果没有权限就跳转到这个Action上:
再次操作后, Dave点击About后就会因为权限不足而跳转到该页面:
今天先到这, 我自己几乎不用MVC, 我主要是做Web API的, 这部分的内容大部分来自官方文档和其他一些资料综合出来的.
代码: https://github.com/solenovex/Identity-Server-4-Tutorial-Code 02部分
Identity Server 4 - Hybrid Flow - Claims的更多相关文章
- Identity Server 4 - Hybrid Flow - MVC客户端身份验证
预备知识 可能需要看一点点预备知识 OAuth 2.0 不完全简介: https://www.cnblogs.com/cgzl/p/9221488.html OpenID Connect 不完全简介: ...
- Identity Server 4 - Hybrid Flow - 保护API资源
这个系列文章介绍的是Identity Server 4 的 Hybrid Flow, 前两篇文章介绍了如何保护MVC客户端, 本文介绍如何保护API资源. 保护MVC客户端的文章: https://w ...
- Identity Server 4 - Hybrid Flow - 使用ABAC保护MVC客户端和API资源
这个系列文章介绍的是Identity Server 4 实施 OpenID Connect 的 Hybrid Flow. 保护MVC客户端: https://www.cnblogs.com/cgzl/ ...
- ASP.NET Core Web API 索引 (更新Identity Server 4 视频教程)
GraphQL 使用ASP.NET Core开发GraphQL服务器 -- 预备知识(上) 使用ASP.NET Core开发GraphQL服务器 -- 预备知识(下) [视频] 使用ASP.NET C ...
- Identity Server 4 原理和实战(完结)_Authorization Code Flow 实例
Code在Oauth2.0和OpenId Connect里面分别叫做不同的名字 OAuth只介绍了如何授权.没有介绍如何身份认证. OpenId Connect:既规定了怎么授权,也规定了怎么身份认证 ...
- Identity Server 4 预备知识 -- OpenID Connect 简介
我之前的文章简单的介绍了OAuth 2.0 (在这里: https://www.cnblogs.com/cgzl/p/9221488.html), 还不是很全. 这篇文章我要介绍一下 OpenID C ...
- 使用Identity Server 4建立Authorization Server (4)
预备知识: http://www.cnblogs.com/cgzl/p/7746496.html 第一部分: http://www.cnblogs.com/cgzl/p/7780559.html 第二 ...
- IdentityServer4-MVC+Hybrid实现Claims授权验证(四)
上节以对话形式,大概说了几种客户端授权模式的原理,这节重点介绍Hybrid模式在MVC下的使用.且为实现IdentityServer4从数据库获取User进行验证,并对Claim进行权限设置打下基础( ...
- 学习Identity Server 4的预备知识
我要使用asp.net core 2.0 web api 搭建一个基础框架并立即应用于一个实际的项目中去. 这里需要使用identity server 4 做单点登陆. 下面就简单学习一下相关的预备知 ...
随机推荐
- Java系列2 --- 你真的知道Java的String对象么?
在上一篇中说道这篇文章会说java的动态绑定机制,由于这个知识点放在继承中讲会比较合适,说以在这篇文章中先来详细的说说String对象吧. 只要学过Java的同学,我们都知道Java一共有8中基本 ...
- logrotate 进行nginx日志分割
http://www.williamsang.com/archives/1254.html 日志分割常用方法: 自己写脚本分割 使用linux自带的logrotate 前者灵活,可以应对各种需求,自定 ...
- windows server 2012 R2汉化 -- 玩转Microsoft Azure
Microsoft Azure 试用版小试牛刀 首先需要申请一个账号获得试用权 我这里是1元免费试用, 进入后就可以创建自己的虚拟机及数据库 在这里先说创建的windows server 2012 R ...
- Java 读书笔记 (十三) for each 循环
JDK 1.5引进了一种新的循环类型,被称为foreach循环或者加强型循环,它能在不使用下标的情况下遍历数组. 实例: public class TestArray{ public static v ...
- [Usaco2005 dec]Layout 排队布局 差分约束
填坑- 差分约束一般是搞一个不等式组,求xn-x1的最大最小值什么的,求最大值就转化成xa<=xb+w这样的,然后建图跑最短路(这才是最终约束的),举个例子 x1<=x0+2x2<= ...
- 【递推】Bzoj3612[Heoi2014]平衡
Description 下课了,露露.花花和萱萱在课桌上用正三棱柱教具和尺子摆起了一个“跷跷板”. 这个“跷跷板”的结构是这样的:底部是一个侧面平行于地平面的正三棱柱教具, 上面 摆着一个尺 ...
- CentOS7防火墙管理firewalld
学习apache安装的时候需要打开80端口,由于centos 7版本以后默认使用firewalld后,网上关于iptables的设置方法已经不管用了,想着反正iptable也不太熟悉,索性直接搬官方文 ...
- Linux 下配置Nginx,MySql,php-fpm开机启动
一. Nginx 开机启动 1.在/etc/init.d/目录下创建脚本 vim /etc/init.d/nginx 2.编写脚本内容 (将以下复制进去相应改动安装路径) #!/bin/bash # ...
- 【Teradata SQL】从中文数字字母混合字符串中只提取数字regexp_substr
目标:从中文数字字母的字符串中只提取数字 sel regexp_substr('mint choc中文11国1','\d+')
- XiaomiPushDemo【小米推送集成,基于V3.6.12版本】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这个Demo只是记录小米推送的集成,不能运行. 使用步骤 一.项目组织结构图 注意事项: 1. 导入类文件后需要change包名以 ...