Identity Server 4 - Hybrid Flow - 保护API资源
这个系列文章介绍的是Identity Server 4 的 Hybrid Flow, 前两篇文章介绍了如何保护MVC客户端, 本文介绍如何保护API资源.
保护MVC客户端的文章: https://www.cnblogs.com/cgzl/p/9253667.html, https://www.cnblogs.com/cgzl/p/9268371.html
相关代码: https://github.com/solenovex/Identity-Server-4-Tutorial-Code 里面03那部分.
回顾 Hybrid Flow
回顾一下该项目使用的流程
图里有IDP (Identity Provider, 我例子里是用Identity Server 4构建的项目)和客户端(我的例子里是MVC客户端).
在上面流程走完之后, MVC客户端获得了Access Token, MVC客户端验证Access Token并成功后, 就可以使用Access Token来访问被保护的API资源了, 而Access Token会在被保护的API那里再次进行验证.
保护API
首先在IDP里配置一个返回ApiResoruce的方法:
和IdentityResource类似, ApiResource就是与API相关的scopes.
在Client配置那里, 把这个ApiResource的名字添加到允许的scopes里:
最后在IDP的startup里, 注册ApiResources:
现在来到MVC客户端这里, 需要把上面的scope添加上:
最后来到API项目, 首先确保使用HTTPS:
API项目还需要安装IdentityServer4.AccessTokenValidation这个包, 可以通过Nuget安装.
安装后, 还需要进行配置 (官方文档: https://identityserver4.readthedocs.io/en/release/quickstarts/1_client_credentials.html#adding-an-api):
其中IdentityServerAuthenticationDefaults.AuthenticationScheme 就是 “Bearer” 的意思, 这里使用的就是这个方案.
AddIdentityServerAuthentication()方法注册了Access Token 验证的处理者. 里面Authority就是IDP的URI, ApiName就是IDP里配置的API的名字.
在Startup的Configure方法里, 还需要把它添加到管道:
要确保它在UseMVC之前调用.
我在API项目里使用过滤器为所有的Controller都加上了授权过滤:
当然也可以在具体的Controller或Action级写上这个:
无论如何现在访问Country资源是需要授权的.
回到MVC客户端, 在Home的Contact Action里调用CountryAPI资源:
下面测试一下未使用Access Token访问被保护的Country资源的情况, 重新操作可以看到用户同意授权页面出现了刚才配置的API资源名:
在访问Contact页面的时候, 提示未授权:
那就用之前介绍过的方法来获取Access Token并设置Authorization Header为 “Bearer [AccessToken]” 即可:
再修改一下Contact页面, 显示Access Token:
重新操作, 就可以看到Country资源数据了:
Access Token
去jwt.io对Access Token进行解码:
看一下aud (audience, 观众) 这个属性, 它有两个值, 第一个是指IDP那边对资源 (调用用户信息端点), 第二个就是指API那个项目.
这个属性说明这个access token是为它们俩准备的.
而scope里面的“restapi”就是aud里面的“restapi”, 所以这个token允许被用来访问我们的“restapi”.
而scope里面的“profile”等scopes是对应另一个aud的值, 这些scopes来自IDP那里.
现在Access Token有这些claims, API也就能得到这些claims, 但是有时API还需要用户身份相关的claims.
修改IDP的ApiResource配置即可:
再次操作后, 查看token, 就可以看到我刚刚添加的那两个claim了:
而role这个claim, 在API里是可以被识别成角色的, 如果我在API的Action上设置权限如下:
那么, Nick这个用户就可以得到Country数据, 而Dave则会显示403 Forbidden:
Identity Server 4 - Hybrid Flow - 保护API资源的更多相关文章
- Identity Server 4 - Hybrid Flow - Claims
前一篇 Identity Server 4 - Hybrid Flow - MVC客户端身份验证: https://www.cnblogs.com/cgzl/p/9253667.html Claims ...
- Identity Server 4 - Hybrid Flow - 使用ABAC保护MVC客户端和API资源
这个系列文章介绍的是Identity Server 4 实施 OpenID Connect 的 Hybrid Flow. 保护MVC客户端: https://www.cnblogs.com/cgzl/ ...
- Identity Server 4 - Hybrid Flow - MVC客户端身份验证
预备知识 可能需要看一点点预备知识 OAuth 2.0 不完全简介: https://www.cnblogs.com/cgzl/p/9221488.html OpenID Connect 不完全简介: ...
- .net core 中 identity server 4 之Topic --定义API资源
想要让客户端能够访问API资源,就需要在Identity Server中定义好API的资源. Scope作用域:即API资源的访问范围限制. 作用域是一个资源 (通常也称为 Web API) 的标识符 ...
- ASP.NET Core3.1使用IdentityServer4中间件系列随笔(二):创建API项目,配置IdentityServer保护API资源
配套源码:https://gitee.com/jardeng/IdentitySolution 接上一篇<ASP.NET Core3.1使用IdentityServer4中间件系列随笔(一):搭 ...
- ASP.NET Core Web API 索引 (更新Identity Server 4 视频教程)
GraphQL 使用ASP.NET Core开发GraphQL服务器 -- 预备知识(上) 使用ASP.NET Core开发GraphQL服务器 -- 预备知识(下) [视频] 使用ASP.NET C ...
- 用 Identity Server 4 (JWKS 端点和 RS256 算法) 来保护 Python web api
目前正在使用asp.net core 2.0 (主要是web api)做一个项目, 其中一部分功能需要使用js客户端调用python的pandas, 所以需要建立一个python 的 rest api ...
- asp.net core系列 54 IS4用客户端凭据保护API
一. 概述 本篇开始进入IS4实战学习,从第一个示例开始,该示例是 “使用客户端凭据保护API”,这是使用IdentityServer保护api的最基本场景.该示例涉及到三个项目包括:Identity ...
- IdentityServer4关于多客户端和API的最佳实践【含多类型客户端和API资源,以及客户端分组实践】【下】
经过前两篇文章你已经知道了关于服务器搭建和客户端接入相关的基本资料,本文主要讲述整个授权系统所服务的对象,以ProtectApi资源为演示 目标: 1)实现多资源服务器针对请求的token校验,接入I ...
随机推荐
- 值得注意的CSS属性
文本TEXT letter-spacing 字符间距 word-spacing 字间距 line-height 行高 text-decoration 修饰(下划线) text-indent 首行缩进 ...
- springMVC简单的一些操作
SpringMVC的模型-视图-控制器(MVC)框架是围绕一个DispatcherServlet来设计的,这个Servlet会把请求分发给各个处理器进行处理,由DispatcherServlet来统一 ...
- Python爬取谷歌街景图片
最近有个需求是要爬取街景图片,国内厂商百度高德和腾讯地图都没有开放接口,查询资料得知谷歌地图开放街景api 谷歌捷径申请key地址:https://developers.google.com/maps ...
- 解决python2.x用urllib2证书验证错误, _create_unverified_context
解决以下错误: 错误1:AttributeError: 'module' object has no attribute '_create_unverified_context', 错误2:URLEr ...
- mysql运维必会的一些知识点整理
(1)基础笔试命令考察 1.开启MySQL服务 /etc/init.d/mysqld start service mysqld start systemctl start mysqld 2.检测端口是 ...
- BZOJ_3362_[Usaco2004 Feb]Navigation Nightmare 导航噩梦_并查集
BZOJ_3362_[Usaco2004 Feb]Navigation Nightmare 导航噩梦_并查集 Description 农夫约翰有N(2≤N≤40000)个农场,标号1到N,M( ...
- layer的删除询问框的使用
删除是个很需要谨慎的操作 我们需要进行确认 对了删除一般使用ajax操作 因为如果同url请求 处理 再返回 会有空白页 1.js自带的样式 <button type="button& ...
- laravel5.5解决小程序登陆态的问题
修改一个文件 : vendor\laravel\framework\src\Illuminate\Session\Middleware\StartSession.php 找到getSession()方 ...
- 一副美丽而庞大的SQL TUNING计划美图
最近因为很忙,一直忙着开发公司的产品和客户的事情,杂七杂八,忙的不亦乐乎,所以,好久没有来这里写东西,这两天为客户优化了一个系统,优化前CPU持续冲顶爆满,导致系统卡死,应用系统不能正常使用,其中有个 ...
- python书籍推荐:python编码推荐(高清完整pdf)
目录INF-qa Python 编码规范................................................................................ ...