Identity Server 4 原理和实战(完结)_Hybrid Flow 实例, Claims, 角色授权和策略授权...

本文详细介绍了使用HybirdClient客户端与IdentityServer服务端进行身份验证的配置过程,包括客户端配置、用户声明添加、JWT解析及基于角色和策略的授权方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


















4分50




建立客户端


不需要身份认证

客户端叫做HybirdClient


配置IdentityServer服务端,先把客户端添加上






把userClaims添加到token里面


然后运行服务端就可以了

客户端配置


和之前的配置差不多,先把代码贴上



和之前的区别可能是这里的相应类型有区别




启动地址端口改成 7000端口
HomeController需要处理,首先需要登陆


服务端的端口也需要改成7000

运行测试


一运行客户端就会跳转到授权服务器

登陆,请求权限

成功跳转

访问被保护资源

之前把之前的代码全部复制到HomeController和两个View页面内





claims



mvc的客户端有这么一句话


服务端把这里设置为true,表示把claims放到idToken里面

运行mvc客户端看到的结果,这些是直接从idToken里面获取出来的

客户端把claims的映射的clear方法这句话注释掉

可以看到Claims的key是这种样子的。这就是jwt的claimType。刚才比较简洁的方式是well-know的方式

复制这里的idToken

复制到jwt.io网站解析



把那句话注释的,客户端的 不再注释

左右对比这些值

例如这些都没有出现在我们客户端的Userclaims上

这是因为们我们使用的这个中间件,默认会过滤掉认为我们不需要的claims。例如:nbf、exp等等
那么怎么防止这些东西被过滤掉
在客户端,有个集合会把集合内的cliams给过滤掉,例如这里我们这里把nbf给从集合remove掉,就不会过滤这个nbf了



需要重新登陆一下,再次运行客户端就看到nbf这些都有了


sid和sub 设置被过滤掉

还是在客户端设置

这样就被过滤掉了

授权方式



以前比较流行的方式是基于角色来授权

基于角色的授权

角色具体在生产环境中怎么维护先不管,这里演示 先都写死
这是服务端的设置,这里是身份的认证信息

添加一个新的角色的Scope,这个scope的名字叫做roles,它里面有个claim就是role

然后设置让我们的客户端可以访问这个roles

然后配置客户端,客户只要在这里添加一个scope就可以了


登陆后我们看到出现了一个scope叫做角色


客户端,当前角色是管理员,可以看到了,

设置客户端的Action只能管理员访问

默认的首页管理和普通用户都可以访问


没有映射mvc客户端里面的角色

先把index的橘色设置这个注释掉,加断点进行调试。user.IsInRole判断用户时候包含这个管理员的角色

当前用户不是管理员。

看一下user的claims、确实有一个role但是这个role并没有成为我们mvc角色系统里面那个role。所以这里需要某种映射

客户端进行映射。nameClaimType和RoleClaimType分别取的是jwtClaimType里面的类型

再次运行结果是true。看一下user的identity的Name值是正确的

然后这里的controller就可以设置这个角色了

没有权限的时候访问的是一个Account/AccessDenied这么个路由


我们应该做这么个路由,当没有权限的时候去访问这个页面。






修改权限被角色的访问地址,客户端这里有一个选项


测试

 

基于策略的授权


可以把策略附加到action上,action也可以有多个策略。这种比较灵活,现在这种方式用的比较多
看服务器端的用户信息
我们来定义FamilyName为Smith并且lication也就是地址为someWhere的这么个策略


客户端设置,首先要求,用户必须是登陆的用户


然后是必须包含这么两个Claim。
1是FamilyName是Smith
2是location的claim的值是somwhere

当然这里也可以设置对应多个值,这里我们测试先设置为smith即可

服务端还需要设置用户返回的信息





访问api1资源的时候,这么设置就会带上这个location的claim


客户端配置



运行

客户端设置


修改为策略授权

再次测试只有满足策略的用户才能访问。
使用侧录的好处就是,直接可以改策略的代码不用,再修改controller这里的代码

策略的结构


自定义Requirement



这样这个类就写完了。然后就是写handler

新建类SmithInSomeWhereHandler




使用Alice用户测试




条件没有满足所以为Fail

改用Bob用户

条件都满足

可以正常访问


每个Requirement可以有多个handler,如果其中一个handler返回了成功其他的handler都没有返回失败




 

转载于:https://www.cnblogs.com/wangjunwei/p/10964604.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值