【壹刊】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 版权:转载请在文章明显位置注明作者及出处。如发现错误,欢迎批评指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309899.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux aspnet服务器,在Linux中安装ASPNET.Core3.0运行时的示例代码

摘要:# 以下示例适用于x64位runtime v3.0.0mkdir /runtimescd /runtimeswget https://... # 以下示例适用于x64位runtime v3.0.0mkdir /runtimescd /runtimeswget https://download.visualstudio.microsoft.com/download/pr/b0c44e05-b7a1-4221-94ec-a0c0d3a11eed/a…

And Then There Was One POJ - 3517(变形约瑟夫环+规律)

题意: 约瑟夫问题的变式。先指定第m个人必须死,然后每隔k个人死一个。求最后那个死的人的编号是什么。 题目 Let’s play a stone removing game. Initially, n stones are arranged on a circle and numbered 1, …, n clockwise (Figure 1). You a…

明明可以靠技术吃饭,现在却非要出来当编剧!

这是头哥侃码的第199篇原创前不久,有位读者深夜时在后台留言说:“我在某技术大会现场听过你的分享。”“说实话,第一次见你,真的很难想象一幅猛男外表的人竟然会有这样的经历和谈吐,这两点让我很钦佩。”这还不算完&am…

[C++11]decltype类型推导规则

在某些情况下,不需要或者不能定义变量,但是希望得到某种类型,这时候就可以用C11提供的decltype关键字了,它的作用是在编译器编译的时候推导出一个表达式的类型。 语法: decltype (表达式)decltype是"declare type “的缩写…

linux不能更改密码,Linux服务器无法更改密码的解决办法--passwd: User not known

上面仅是告知我,这些帐号并没有家目录,由于那些帐号绝大部分都是系统帐号, 确实也不需要家目录的,所以,那是‘正常的错误!’,相对应的群组检查可以使用 grpck 这个指令。pwck 确保系统鉴认信息的完整性,pwc…

PowerBIDeskTop报表元数据批量更新(可用于翻译场景)

PowerBI在多国语言场景上有极大的缺陷,原有的Sqlserver的SSAS和Azure的AS模型层翻译功能,在Excel和PowerBIDeskTop客户端上均可完美适配。但到了PowerBI Pro的Service网页端时,竟然不支持。这个问题已经明确是官方给出的答复,起码…

操作系统习题——(习题二)

操作系统习题——第一章 1. OS 有哪几大特征?其最基本的特征是什么? 答:并发性、共享性、虚拟性和异步性四个基本特征;最基本的特征是并发性和共享性。 2.处理机管理有哪些主要功能? 答:处理机管理的主…

[C++11]decltype在泛型编程中的使用举例

关于decltype的应用多出现在泛型编程中&#xff0c;比如我们编写一个类模板&#xff0c;在里面添加遍历容器的函数&#xff0c;操作如下: 代码如下: #include <iostream> #include <list>using namespace std;template<typename T> class Container { publ…

追了多年的开发框架,你还认识指针吗?

一&#xff1a;背景1. 讲故事高级语言玩多了&#xff0c;可能很多人对指针或者汇编都淡忘了&#xff0c;本篇就和大家聊一聊指针&#xff0c;虽然C#中是不提倡使用的&#xff0c;但你能说指针在C#中不重要吗&#xff1f;你要知道FCL内库中大量的使用指针&#xff0c;如String,E…

linux apt-get 安装 根目录,技术|apt-get 和 apt-cache 命令实例展示

apt-get和apt-cache是Ubuntu Linux中的命令行下的包管理工具。 apt-get的GUI版本是Synaptic包管理器。本篇中我们会展示apt-get和apt-cache命令的15个不同例子。示例&#xff1a;1 列出所有可用包linuxtechilocalhost:~$ apt-cache pkgnamesaccount-plugin-yahoojpceph-fusedvd…

[PAT乙级]1031 查验身份证

一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下&#xff1a; 首先对前17位数字加权求和&#xff0c;权重分配为&#xff1a;{7&#xff0c;9&#xff0c;10&#xff0c;5&#xff0c;8&#xff0c;4&#xff0c;2&#xff0c;1&am…

Long Path CodeForces - 407B(动态规划+思维+公式推导)

题意&#xff1a; 起点为1&#xff0c;终点为n1&#xff0c;对应第i个各点&#xff0c;如果我奇数次到达i点&#xff0c;那么下一步走到a【i】的位子&#xff0c;如果是偶数次到达&#xff0c;那么下一步走到i1的位子。 问从1走到n1一共需要走多少步&#xff1f;结果对1e97取模…

[PAT乙级]1032 挖掘机技术哪家强

为了用事实说明挖掘机技术到底哪家强&#xff0c;PAT 组织了一场挖掘机技能大赛。现请你根据比赛结果统计出技术最强的那个学校。 输入格式&#xff1a; 输入在第 1 行给出不超过 10​5​​ 的正整数 N&#xff0c;即参赛人数。随后 N 行&#xff0c;每行给出一位参赛者的信息…

断!舍!离!

最近颈椎病很严重&#xff0c;各种寻医问药&#xff0c;找各路中西医专家治疗。无奈&#xff0c;一直不见好。每周我都会去一个中医大夫那里做推拿&#xff0c;有一次我抱怨&#xff0c;这个病怎么这么难弄好。大夫笑了笑&#xff0c;说&#xff1a;颈椎病其实是个哲学问题。我…

linux权限746,linux文件权限学习笔一

linux文件权限学习随笔一linux中&#xff0c;文件权限一直是困扰初学者的难题。但是还必须要把文件权限搞明白&#xff0c;否则你就很难进一步学习linux&#xff0c;因为你听不懂他的说什么&#xff0c;看不懂他的身份&#xff0c;不知道他要做什么。我已经习惯使用windows&…

Compound Words UVA - 10391(c++用法中substr函数用法+map实现)

题意&#xff1a; 给出字典中一堆单词&#xff0c;单词的输入方式是以字典序输入的。问&#xff1a;在这一堆单词中&#xff0c;有那些单词是通过其它两个单词组合而来的。按字典序升序输出这些单词。 题目&#xff1a; You are to find all the two-word compound words in…

[C++11]返回值类型后置

在泛型编程中&#xff0c;可能需要通过参数的运算来得到返回值类型。 语法: auto func(参数1,参数2,...)->decltype(参数表达式)代码如下: #include <iostream> using namespace std;//template<typename R,typename T,typename U> //R add01(T t, U u) //{ …

在鹅厂面试5轮后扑街!微服务架构,我拿什么拯救你!

上周五接到朋友的电话&#xff0c;此前他一路披荆斩棘&#xff0c;离鹅厂Offer大概仅一步之遥。电话一接通我就说了一通让他请客吃饭的话&#xff0c;对面沉默了几秒钟&#xff0c;淡淡地说了句 “我终面没过....” 这让我一时语塞不知如何安慰他。两个中年油腻男硬是打了2小时…

linux加大ram 内核需要,Linux 5.1内核发布:io_uring接口+支持持久性内存用作RAM

拼 命 加 载 中 ...Linus Torvalds今天发布了Linux Kernel 5.1内核&#xff0c;这是一个功能强大的内核分支&#xff0c;它带来了许多重要的新功能&#xff0c;包括但不限于&#xff1a;改进了对IntelFastboot的支持&#xff1b;对Intel 22260 Wi-Fi的支持&#xff1b;对Raspbe…

Minimum Inversion Number HDU - 1394(求一个数字环的逆序对+多种解法)

题意&#xff1a; 给出n个数&#xff08;0~n-1&#xff0c;每个数仅出现一次&#xff09;,问它长为n的循环序列中逆序对最少的数量。 多种解法&#xff1a;暴力树状数组分治规律推导公式 题目&#xff1a; The inversion number of a given number sequence a1, a2, …, an…