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都没有返回失败