Azure AD(二)调用受Microsoft 标识平台保护的 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 参数的值和上面不一样,确实,我也有这个疑问,后来找到微软官方给我的文档解释道:
在此请求中针对 scope 参数传递的值应该是所需资源的资源标识符(应用程序 ID URI),并附有 .default 后缀。 在 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/yunqian44/Azure.AD.WebApi.git
作者:Allen
版权:转载请在文章明显位置注明作者及出处。如发现错误,欢迎批评指正。
Azure AD(二)调用受Microsoft 标识平台保护的 ASP.NET Core Web API 下的更多相关文章
- Azure AD(二)调用受Microsoft 标识平台保护的 ASP.NET Core Web API  上
		
一,引言 上一节讲到Azure AD的一些基础概念,以及Azure AD究竟可以用来做什么?本节就接着讲如何在我们的项目中集成Azure AD 包含我们的API资源(其实这里还可以在 SPA单页面应用 ...
 - ASP.NET Core Web API下事件驱动型架构的实现(二):事件处理器中对象生命周期的管理
		
在上文中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发.订阅和处理的流程.这种实现太简单了,百十行代码就展示了一个基本工作原理.然而,要将这样的解决方案运用到实际生产环境,还有很 ...
 - List多个字段标识过滤  IIS发布.net core mvc web站点  ASP.NET Core 实战:构建带有版本控制的 API 接口  ASP.NET Core 实战:使用 ASP.NET Core Web API 和 Vue.js 搭建前后端分离项目 Using AutoFac
		
List多个字段标识过滤 class Program{ public static void Main(string[] args) { List<T> list = new List& ...
 - ASP.NET Core Web API + Angular 仿B站(二)后台模型创建以及数据库的初始化
		
前言: 本系列文章主要为对所学 Angular 框架的一次微小的实践,对 b站页面作简单的模仿. 本系列文章主要参考资料: 微软文档: https://docs.microsoft.com/zh-cn ...
 - 在ASP dot  Net Core  MVC中用Controllers调用你的Asp dotnet Core Web API 实现CRUD到远程数据库中,构建你的分布式应用(附Git地址)
		
本文所有的东西都是在dot Net Core 1.1环境+VS2017保证测试通过. 本文接着上次文章接着写的,不了解上篇文章的可能看着有点吃力.我尽量让大家都能看懂.这是上篇文章的连接http:// ...
 - ASP.NET Core Web Api之JWT VS Session VS Cookie(二)
		
前言 本文我们来探讨下JWT VS Session的问题,这个问题本没有过多的去思考,看到评论讨论太激烈,就花了一点时间去研究和总结,顺便说一句,这就是写博客的好处,一篇博客写出有的可能是经验积累,有 ...
 - 微软Azure配置中心 App Configuration (一):轻松集成到Asp.Net Core
		
写在前面 在日常开发中,我这边比较熟悉的配置中心有,携程Apollo,阿里Nacos(配置中心,服务治理一体) 之前文章: Asp.Net Core与携程阿波罗(Apollo)的第一次亲密接触 总体来 ...
 - 【翻译】使用Visual Studio在Azure上部署Asp.Net Core Web应用
		
配置运行环境 Install the latest Azure SDK for Visual Studio. The SDK installs Visual Studio if you don't a ...
 - ASP.NET MVC Web API 学习笔记---第一个Web API程序---近来很多大型的平台都公开了Web API
		
1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过 ...
 
随机推荐
- tensorflow-参数、超参数、卷积核权值共享
			
根据网上查询到的说法,参数就是在卷积神经网络中可以被训练的参数,比如卷积核的权值和偏移等等,而超参数是一些预先设定好并且无法改变的,比如说是卷积核的个数等. 另外还有一个最最基础的概念,就是卷积核的权 ...
 - Windows10 下安装SourceTree 跳过注册 Bitbucket
			
前提:安装Git 下载Windows系统可执行文件SourceTreeSetup-3.1.3.exe 双击安装,会出现如下界面: 关闭这个界面 C:\Users\当前用户文件夹\AppData\Loc ...
 - 2. Git-命令行-删除本地和远程分支
			
命令行方式 Git Bash: 切换到要操作的项目文件夹 命令行 : $ cd <ProjectPath> 查看项目的分支们(包括本地和远程) 命令行 : $ git branch -a ...
 - [YII2] 去除自带js,加载自己的JS,然后ajax(json)传值接值!
			
本想用YII2自带的JS,可是用着效果不好,想从新加载,找了好多终于实现啦!还有ajax(json)传值接值! 首先直接了当的就把YII2自带的js去掉! 把下面代码加入到/config/main.p ...
 - python 进阶篇 python 的值传递
			
值传递和引用传递 值传递,通常就是拷贝参数的值,然后传递给函数里的新变量,这样,原变量和新变量之间互相独立,互不影响. 引用传递,通常是指把参数的引用传给新的变量,这样,原变量和新变量就会指向同一块内 ...
 - python 工具链 多版本管理工具 pyenv
			
理解Shims pyenv会在系统的PATH最前面插入一个shims目录: $(pyenv root)/shims:/usr/local/bin:/usr/bin:/bin 通过一个rehashing ...
 - 大数据Hbase相关运维题
			
1.启动先电大数据平台的 Hbase 数据库,其中要求使用 master 节点的RegionServer.在 Linux Shell 中启动 Hbase shell,查看 HBase 的版本信息.(相 ...
 - mac OS 安装 nvm
			
nvm官网 https://github.com/creationix/nvm nvm,node,npm之间的区别 nvm:nodejs 版本管理工具 一个 nvm 可以管理很多 node 版本和 n ...
 - iOS9.2.1 App从AppStore上下载闪退问题
			
首先这是小编的第一篇文章,我是一名做iOS开发的小白,出于爱好会更新发表些相关的技术文章,偶尔也会发些视频.恳请大家不要去嘲笑一个努力的人,要是做的不好请多多评论,反正我也不改. 好了!敲黑板!!说正 ...
 - 啃算法:归并排序及JavaScript实现
			
在学习归并排序之前,有必要了解分治法,因为归并排序正是应用了分治模式.(基本定义摘自<算法导论>) 一.分治法 1.思想: 将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些 ...