这个系列文章介绍的是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资源的更多相关文章

  1. Identity Server 4 - Hybrid Flow - Claims

    前一篇 Identity Server 4 - Hybrid Flow - MVC客户端身份验证: https://www.cnblogs.com/cgzl/p/9253667.html Claims ...

  2. Identity Server 4 - Hybrid Flow - 使用ABAC保护MVC客户端和API资源

    这个系列文章介绍的是Identity Server 4 实施 OpenID Connect 的 Hybrid Flow. 保护MVC客户端: https://www.cnblogs.com/cgzl/ ...

  3. Identity Server 4 - Hybrid Flow - MVC客户端身份验证

    预备知识 可能需要看一点点预备知识 OAuth 2.0 不完全简介: https://www.cnblogs.com/cgzl/p/9221488.html OpenID Connect 不完全简介: ...

  4. .net core 中 identity server 4 之Topic --定义API资源

    想要让客户端能够访问API资源,就需要在Identity Server中定义好API的资源. Scope作用域:即API资源的访问范围限制. 作用域是一个资源 (通常也称为 Web API) 的标识符 ...

  5. ASP.NET Core3.1使用IdentityServer4中间件系列随笔(二):创建API项目,配置IdentityServer保护API资源

    配套源码:https://gitee.com/jardeng/IdentitySolution 接上一篇<ASP.NET Core3.1使用IdentityServer4中间件系列随笔(一):搭 ...

  6. ASP.NET Core Web API 索引 (更新Identity Server 4 视频教程)

    GraphQL 使用ASP.NET Core开发GraphQL服务器 -- 预备知识(上) 使用ASP.NET Core开发GraphQL服务器 -- 预备知识(下) [视频] 使用ASP.NET C ...

  7. 用 Identity Server 4 (JWKS 端点和 RS256 算法) 来保护 Python web api

    目前正在使用asp.net core 2.0 (主要是web api)做一个项目, 其中一部分功能需要使用js客户端调用python的pandas, 所以需要建立一个python 的 rest api ...

  8. asp.net core系列 54 IS4用客户端凭据保护API

    一. 概述 本篇开始进入IS4实战学习,从第一个示例开始,该示例是 “使用客户端凭据保护API”,这是使用IdentityServer保护api的最基本场景.该示例涉及到三个项目包括:Identity ...

  9. IdentityServer4关于多客户端和API的最佳实践【含多类型客户端和API资源,以及客户端分组实践】【下】

    经过前两篇文章你已经知道了关于服务器搭建和客户端接入相关的基本资料,本文主要讲述整个授权系统所服务的对象,以ProtectApi资源为演示 目标: 1)实现多资源服务器针对请求的token校验,接入I ...

随机推荐

  1. css中的单冒号和双冒号

    最近突然被别人问起css单冒号和双冒号有什么区别,答曰:"不知道". 虽然还在填坑中,但作为一个跨过了初级的FEer,感觉着实汗颜,刚好今天下午在搜别的问题的时候,突然看到一个对比 ...

  2. 『自我の感悟』alt or title?

    img标签中alt和title属性的正确使用:在的img标签有两个属性分别为alt和title,对于很多初学者而言对这两个属性的正确使用都还抱有迷惑,当然这其中一部分原因也是ie浏览器所导致的.正确的 ...

  3. 23.app后端如何架设文件系统

    现在app展现内容的形式多种多样的,有文字,图片,声音,视频等等,其中文件占了一个很大的比重.随着app不断运营,文件会越来越多,占用的磁盘空间也不断增大,架设一套高效的文件系统,对于整个app架构有 ...

  4. 纯CSS打造进度条

    进度条效果如下: CSS部分 body { background-color: white; } .progress-bar { display: flex; flex-direction: row; ...

  5. 一支烟的时间导致他错失女神,Python查看撤回消息,力挽狂澜!

    2011年1月21日 微信(WeChat) 是腾讯公司于2011年1月21日推出的一个为智能终端提供即时通讯服务的免费应用程序,由张小龙所带领的腾讯广州研发中心产品团队打造 .在互联网飞速发展的下.民 ...

  6. 使用代码的方式给EntityFramework edmx 创建连接字符串

    在构建上下文的时候动态生成连接字符串: /// <summary> /// 从配置生成连接 /// </summary> private static readonly str ...

  7. 记录一波由会话堵塞导致tomcat应用故障事件

    一.故障基本信息 发生时间 消除时间 故障历时 故障类别 影响 2018-5-17 18:14:30 2018-05-18 08:58:15 16小时 应用故障 业务瘫痪,用户投诉 二.故障现象 AP ...

  8. [Poi2012]A Horrible Poem BZOJ2795

    分析: 这是今天下午的考试题,推了2个小时,考试中A掉了 首先,循环串通过字符串hash可以O(1)判断:get_hash(l,r-len)==get_hash(l+len,r);显然可证. 我们其次 ...

  9. B20J_1297_[SCOI2009]迷路_矩阵乘法

    B20J_1297_[SCOI2009]迷路_矩阵乘法 题意:有向图 N 个节点,从节点 0 出发,必须恰好在 T 时刻到达节点 N-1.总共有多少种不同的路径? 2 <= N <= 10 ...

  10. 从MVC和三层架构说到SSH整合开发

    相信很多人都认同JavaWeb开发是遵从MVC开发模式的,遵从三层架构进行开发的,是的,大家都这么认同.但是相信大家都会有过这样一个疑问,if(MVC三层模式==三层架构思想)out.println( ...