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:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员的SOD蜜

新手,Visual Studio 2015 配置Boost库,如何编译和选择,遇到无法打开文件“libboost_thread-vc140-mt-gd-1_63.lib“的解决办法

1,到官网下载最新的boost,www.boost.org 这里我下载的1-63版本. 2,安装,解压后运行bootstrap.bat文件。稍等一小会就OK。 ...

4285
来自专栏Jerry的SAP技术分享

让SAP云平台上的Web应用使用destination服务

首先在SAP云平台里创建一个destination,维护service的end point:

3835
来自专栏从零开始学自动化测试

Fiddler抓包4-工具介绍(request和response)

前言 本篇简单的介绍下fiddler界面的几块区域,以及各自区域到底是干什么用的,以便于各好的掌握这个工具 一、工具简介 1.第一块区域是设置菜单,这个前面2篇...

3006
来自专栏编程

Selenium3+Python3环境部署

声明 本公众号所有内容,均属微信公众号: 开源优测 所有,任何媒体、网站或个人未经授权不得转载、链接、转贴或以其他方式复制发布/发表。已经本公众号协议授权的媒...

2079
来自专栏哈雷彗星撞地球

你知道如何为iOS工程改名吗?

我们在iOS开发中,难免会遇到项目做到一半要改名字的情况。如果项目名差的太大,工程名看起来总是不舒服的,有良心的开发者可能就会想着为工程改个贴切的名字,那么你就...

1393
来自专栏about云

zookeeper思考与总结1:在其它组件的作用及hdfs对比

一、zookeeper在其它组件的作用 1.为什么会产生zookeeper zookeeper是模仿的谷歌的Chubby来解决分布式一致性的问题。2006年的时...

3945
来自专栏Youngxj

emlog最新文章邮件推送插件1.3

2183
来自专栏BIT泽清

React Native应用部署/马甲包热更新-CodePush最新集成总结(2018年最新)

React Native支持大家用React Native技术开发APP,并打包生成一个APP。在动态更新方面React Native只是提供了动态更新的基础,...

3610
来自专栏草根专栏

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

这个系列文章介绍的是Identity Server 4 实施 OpenID Connect 的 Hybrid Flow. 

1404
来自专栏电光石火

eclipse汉化

以前一直没发出来,今天整理时发现就发出来了!

2245

扫码关注云+社区

领取腾讯云代金券