【壹刊】Azure AD 保护的 ASP.NET Core Web API (下)
一,引言
上一节讲到如何在我们的项目中集成Azure AD 保护我们的API资源,以及在项目中集成Swagger,并且如何把Swagger作为一个客户端进行认证和授权去访问我们的WebApi资源的?本节就接着讲如何在我们的项目中集成 Azure AD 保护我们的API资源,使用其他几种授权模式进行授权认证,好了,开始今天的表演。????????????????????
二,正文
1,access_token的剖析!
上一篇结尾我们成功的拿到了 access_token,并且通过 access_token 验证获取到调用Api资源的结果。我们先从swagger中去复制access_token,如图所示:
然后去 JWT.IO 解析 token
以下是解析出的全部内容,牵扯到个人隐私的内容,以使用 ‘x’ 符号代替,还请见谅
{"aud": "f38ec09d-203e-4b2d-a1c1-faf76a608528","iss": "https://sts.chinacloudapi.cn/53359126-8bcf-455d-a934-5fe72d349207/","iat": 1589374088,"nbf": 1589374088,"exp": 1589377988,"acr": "1","aio": "AUQAu/8HAAAABTQ0iHchtR+GpkOehfH2AYXoIa0tBYg0sf1atq88824rp/+ucL2LpSdCZB8SvLbZ7dpzxUh/BUThEiz5r05COg==","amr": ["pwd"],"appid": "62ca9f31-585c-4d28-84b6-25fb7855aed0","appidacr": "0","email": "xxx@xxx.partner.onmschina.cn","family_name": "xxx","given_name": "xxx@xxx.partner.onmschina.cn","idp": "https://sts.chinacloudapi.cn/71c1d8b2-6eec-4ae9-8671-208667b351c9/","ipaddr": "113.201.51.xxx","name": "xxx@xxx.partner.onmschina.cn yun","oid": "0f7b8378-d133-4d76-8e5c-daf93a553b6e","scp": "Order.Read","sub": "-FvDwjpV6m3ZHBCC-MePlP-iSqmHi39_s5wvTCagThU","tid": "53359126-8bcf-455d-a934-5fe72d349207","unique_name": "xxx@xxx8.partner.onmschina.cn","uti": "V1-3tIF2nEWUH7CH1FkOAA","ver": "1.0"
}
从这些信息不难看到,令牌的颁发者,颁发时间,失效时间,客户端Id等等信息
着重看以下这几个参数:
1,aud(audience):听众。这里直译起来比较拗口,其实说白了,就是这个令牌用于谁,使用令牌去访问谁,谁就是audience。
2,iss(Issuer):颁发者。是只谁颁发的这个令牌,很显眼就我们azure认证的一个域在加上我们创建的这个租户
3,iat:令牌颁发时间
4,exp:令牌过期时间,与上面的颁发时间相差5分钟
5,appid:客户端Id,就是在Azure AD里面给Swagger注册的客户端应用的Id
6,scp:权限范围,我们为Swagger授权访问WebApi的权限
看到这里,是不是感觉和 Identity Server 4授权验证中心的好多配置特别相似。是的,这里也不要感觉到奇怪,Azure AD 也是基于OAuth 2.0和Open Id Connect协议的一种认证授权体系。只要有了 Identity Server 4的一些基础,学习Azure AD的这套认证授权也是很好入手的。
2,使用 Resource Owner Password Credentials 访问 API 资源
Resource Owner其实就是User,密码模式相较于客户端凭证模式,多了一个参与者,就是User。通过User的用户名和密码向认证中心申请访问令牌。
按照惯例,在postman中直接进行调用order的接口。
ResponseCode:401,提示没有权限。
1)为WebApi应用创建客户端密码
选择过期时间,点击 ”添加“
复制这个密码的值,提示以下,切换到其他页面后,就无法再进行复制了,所有提前先复制好。
2)查看资源所有者
选择 管理=》所有者 打开资源所有者页面
图上显示已经有一个所有者账号,有人就问了,自己明明没有添加任何所有者信息,为什么就凭空冒出来一个所有者账号。其实不难看出,这个账号就是我们当前azure portal的登录账号,也是当前订阅的管理员账号,而且我们在创建MyCommany这个租户的时候也是使用的当前登录的账号,所有当前登录的账号也就自然而然的成为当前租户下应用注册的资源所有者。
3)查看WebApi的作用域
选择 管理=》公开 API
复制 WebApi的作用域
4)查看WebApi的终结点
复制当前应用程序的 OAuth 2.0令牌终结点(v2)链接,注意圈起来的 organization 参数,这个需要换成当前应用程序所在的租户的Id。
5)测试
1)统一验证,获取token
tenant:应用程序计划对其进行操作的目录租户。参数必传
client_id:分配给应用的应用程序ID,可以在注册应用的门户中找到。参数必传。
scope:在此请求中针对 scope参数传递的值应该是所需资源的资源标识符。参数可选。
client_secret:在应用注册门户中为应用生成的客户端机密。参数必传
grant_type:必须设置为 password。参数必传
username:用户的电子邮件地址
password:用户的密码
2)访问 api/order
砰,成功!此处应该有掌声????????????????????,成功的通过验证,并且获取到 api资源,但是这种模式是最不推荐的,因为client可能存了用户密码,此模式仅用于受信任的客户端。复制会发生密码泄露。所以不推荐使用。
当然,我们也会根据实际项目的情况选择不同的授权模式。????
3,使用 Client Credentials 访问资源
客户端凭证模式,是最简单的授权模式,因为授权的流程仅发生在客户端和授权认证中心之间。适用场景为服务器与服务器之间的通信。
1)统一验证,获取token,需要额外注意此处的租户Id,以及scope
tenant:应用程序计划对其进行操作的目录租户。参数必传
client_id:分配给应用的应用程序ID,可以在注册应用的门户中找到。参数必传。
scope:在此请求中针对 scope参数传递的值应该是所需资源的资源标识符。参数必传。
client_secret:在应用注册门户中为应用生成的客户端机密。参数必传
grant_type:必须设置为 client_credentials。参数必传
这时候,就又有人问了,为什么这里的 scope 参数的值和上面不一样,确实,我也有这个疑问,后来找到微软官方给我的文档解释道:
Microsoft Graph 示例中,该值为 https://graph.microsoft.com/.default
。
此值告知 Microsoft 标识平台终结点:在为应用配置的所有直接应用程序权限中,终结点应该为与要使用的资源关联的权限颁发令牌
使用共享机密访问令牌请求:https://docs.microsoft.com/zh-cn/azure/active-directory/develop/v2-oauth2-client-creds-grant-flow
2)访问 api/order
砰,成功,再次撒花祝贺,????????????????????!这种模式直接是通过 client id 和 client secret 来获取 access_token,该方法通常用于服务器之间的通讯
以上就是使用 资源持有者密码授权以及 客户端凭据授权两种授权模式。到此 关于ASP.NET Core Web Api 集成 Azure AD 的授权认证暂时告一段落。
三,结尾
今天的文章大概介绍了如果在我们的项目中集成 Azure AD,以及如何使用 Resource Owner Password Credentials(资源持有者密码认证)和Client Credentials(客户端凭证)
下一篇继续介绍 Azure AD B2C 的相关内容。
github:https://github.com/allentmater/Azure.AD.WebApi.git
作者:Allen
版权:转载请在文章明显位置注明作者及出处。如发现错误,欢迎批评指正。
作者:Allen 版权:转载请在文章明显位置注明作者及出处。如发现错误,欢迎批评指正。
【壹刊】Azure AD 保护的 ASP.NET Core Web API (下)相关推荐
- ASP.NET Core Web API下事件驱动型架构的实现(四):CQRS架构中聚合与聚合根的实现
在前面两篇文章中,我详细介绍了基本事件系统的实现,包括事件派发和订阅.通过事件处理器执行上下文来解决对象生命周期问题,以及一个基于RabbitMQ的事件总线的实现.接下来对于事件驱动型架构的讨论,就需 ...
- 重温.NET下Assembly的加载过程 ASP.NET Core Web API下事件驱动型架构的实现(三):基于RabbitMQ的事件总线...
重温.NET下Assembly的加载过程 最近在工作中牵涉到了.NET下的一个古老的问题:Assembly的加载过程.虽然网上有很多文章介绍这部分内容,很多文章也是很久以前就已经出现了,但阅读之后发现 ...
- ASP.NET Core Web API下事件驱动型架构的实现(三):基于RabbitMQ的事件总线
在上文中,我们讨论了事件处理器中对象生命周期的问题,在进入新的讨论之前,首先让我们总结一下,我们已经实现了哪些内容.下面的类图描述了我们已经实现的组件及其之间的关系,貌似系统已经变得越来越复杂了. 其 ...
- ASP.NET Core Web API下事件驱动型架构的实现(二):事件处理器中对象生命周期的管理
在ASP.NET Core Web API下事件驱动型架构的实现(一):一个简单的实现中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发.订阅和处理的流程.这种实现太简单了,百十行 ...
- ASP.NET Core Web API下事件驱动型架构的实现(一):一个简单的实现
很长一段时间以来,我都在思考如何在ASP.NET Core的框架下,实现一套完整的事件驱动型架构.这个问题看上去有点大,其实主要目标是为了实现一个基于ASP.NET Core的微服务,它能够非常简单地 ...
- 【壹刊】Azure AD(二)调用受Microsoft 标识平台保护的 ASP.NET Core Web API (上)
---------Grant_Allen 是一位博客园新晋博主,目前开始专注于Azure方向的学习和研究,是我认识不多的.打算长时间研究Azure的群友,因此打算帮他开个专栏,同时也希望并祝愿他能一直 ...
- 用JWT来保护我们的ASP.NET Core Web API
在用Middleware给ASP.NET Core Web API添加自己的授权验证 中,自己动手写了一个Middleware来处理API的授权验证,现在就采用另外一种方式来处理这个授权验证的问题,毕 ...
- 保护我方Id | ASP.NET Core Web API使用加密Id
前言 上次,我们介绍了hashids.net,可以将数值型Id加密成无意义的字符串,但是通过这些字符串又可以反向映射出真实的Id以供内部使用.比如B站的播放链接https://www.bilibili ...
- 针对ASP.NET Core Web API的先进架构
\ 本点要点 \\ 与传统的ASP.NET相比,ASP.NET Core的新架构提供了一些好处\\t ASP.NET Core从一开始就包含对依赖注入的支持\\t 单一职责原则简化了实施和设计.\\t ...
最新文章
- TFS 2008 中文版下载及安装完整图解
- SwiftUI之深入解析属性包装器如何处理结构体
- 牛客 - 动物森友会(二分+最大流)
- Linux上传文件和下载文件命令行方式
- 模块使用:time、datetime、calendar、sys、os、os.path、normcase和normapath、random、json、pickle...
- 在ubuntu 16.04中安装source insight 4.0破解版
- centos gcc 版本安装9.3 c++17
- linux tex文件编译,用latexmk编译XeLaTeX tex文件
- lol走砍e源码_【精选】某LOL走砍E盾+VMP卡登陆解决办法
- CAD如何绘制固定面积的矩形
- The English (Porter2) stemming algorithm
- 程序员出海创富的机会在哪里?三位专家给出具体建议
- lucene.net和(pangu)盘古分词 搜索引擎的简单实现
- 读了本书《3000美金,我周游了世界》
- 地图制图领域使用计算机优点在于哪些方面,电子地图制图的运用与发展
- nodejs addon
- python鲜花_【实战案例】90 行Python代码实现一棵鲜花盛开树
- python pyecharts 下载生成的render图片 下载背景为黑色
- 读书笔记《不拘一格》
- CEO采访:从战略层面建立数据驱动型的客户体验策略
热门文章
- poj--2019 Cornfields 2维RMQ
- 开源播放器 Banshee 发布 1.0 beta 2
- 如何获取 Teams Meeting 的上下文信息
- ios 轻扫手势_轻扫即可快速删除iOS计算器中的数字
- 2018-2019 20165226 Exp9 Web安全基础
- Highcharts数据表示(3)
- MVC 之 Partial View 用法
- cookies,sessionStorage 和 localStorage 的区别?
- php中使用exec,system等函数调用系统命令
- paip.提升用户体验--提升java的热部署热更新能力