4分50
api
不须要身份认证
客户端叫作HybirdClient
配置IdentityServer服务端,先把客户端添加上
把userClaims添加到token里面
而后运行服务端就能够了服务器
和以前的配置差很少,先把代码贴上
和以前的区别多是这里的相应类型有区别
启动地址端口改为 7000端口
HomeController须要处理,首先须要登录
服务端的端口也须要改为7000
mvc
一运行客户端就会跳转到受权服务器
登录,请求权限
成功跳转
ide
以前把以前的代码所有复制到HomeController和两个View页面内
测试
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 设置被过滤掉
仍是在客户端设置
这样就被过滤掉了
网站
之前比较流行的方式是基于角色来受权ui
角色具体在生产环境中怎么维护先无论,这里演示 先都写死
这是服务端的设置,这里是身份的认证信息
添加一个新的角色的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这里的代码jwt
这样这个类就写完了。而后就是写handler
新建类SmithInSomeWhereHandler
使用Alice用户测试
条件没有知足因此为Fail
改用Bob用户
条件都知足
能够正常访问
每一个Requirement能够有多个handler,若是其中一个handler返回了成功其余的handler都没有返回失败
中间件