【壹刊】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…

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

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

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

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

[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…

断!舍!离!

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

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

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

C++实现拓扑排序(vector模拟邻接表存储,栈实现)

代码如下: #include<iostream> #include <vector> #include <string> #include <stack> using namespace std; const int N 10010;int in[N]; vector<int>v[N]; vector<int>printElem;int main() {int n, m;while (cin >> n >&…

如何借助Kubernetes实现持续的业务敏捷性

导语在当今以数字为动力&#xff0c;以客户为中心的世界中&#xff0c;敏捷性已成为组织提高其创建软件的速度、提高响应能力以满足不断变化的客户需求、保持敏捷性以适应变化的关键要素。敏捷不是商品&#xff0c;无法购买或轻易获得。要为组织创造可持续的敏捷性&#xff0c;…

C++实现拓扑排序(邻接表存储,栈实现)

代码如下: #include <iostream> #include <stack> using namespace std; const int N 10010; using vnodeType int; typedef struct Node {int adj;int w;Node *next; }Node;typedef struct Vnode {int indegree;vnodeType v;Node *firstEdge; }Vnode;class Gra…

报复性降薪潮来袭

点击蓝字关注&#xff0c;回复“职场进阶”获取职场进阶精品资料一份最近不少读者问我&#xff1a;“洋哥&#xff0c;公司要全员降薪了&#xff0c;我该留下还是走呢”。今年的职场环境的确很残酷&#xff0c;不少公司直接破产&#xff0c;还有很多公司开始降薪裁员来保证现金…

[C++11]通过using定义基础类型和函数指针别名

1.定义别名 语法: typedef 旧的类型名 新的类型名; typedef unsigned int uint_t;using 新的类型 旧的类型; using uint_t int ;通过using和typedef的语法格式可以看到二者的使用没有太大的区别&#xff0c;假如我们定义一个函数指针&#xff0c;using的优势就凸显出来了&…

基于 abp vNext 和 .NET Core 开发博客项目

介绍此个人博客项目底层基于 ABP Framework (不完全依赖)搭建项目 和免费开源跨平台的 .NET Core 3.1 开发&#xff0c;可作为 .NET Core 入门项目进行学习&#xff0c;支持各种主流数据库(SqlServer、MySQL、PostgreSql、Sqlite)接入&#xff0c;接口遵循 RESTful API 接口规范…

操作系统习题三

题目&#xff1a; 1.有8个程序段&#xff0c;他们之间的前驱关系如下&#xff0c;试用信号量实现这些程序段之间的同步 2.简述进程同步机制的基本原则。 答&#xff1a;在多道程序环境下&#xff0c;当程序并发执行时&#xff0c;由于资源共享和进程合作&#xff0c;使同处于…

[C++11]函数模板的默认模板参数

在C11中添加了对函数模板默认参数的支持。 代码如下: #include<iostream> using namespace std;template<typename T long ,typename U int > void myTest(T t A,U u B) {cout << "t " << t << " u " << u <…

揭秘!微软 Build 2020 开发者大会将启,邀您共赴线上新旅程

微软热爱的开发者&#xff0c;开发者热爱的新技术微软Build 2020开发者大会大幕将启行业技术大拿云集&#xff0c;全新技术重磅发布一场专属技术爱好者间的技术交流盛宴北京时间5月19日-20日&#xff0c;邀您会面&#xff01;大会年年有&#xff0c;今年何不同&#xff1f;本届…

linux查找应用主机,Linux 主机和服务器基本性能检查命令和工具

无论我们选择Linux 主机、服务器用来搭建网站&#xff0c;还是用来软件测试项目&#xff0c;在购买之前肯定要查看适合的性价比、配置&#xff0c;以及商家的口碑等一系列的问题。不过&#xff0c;最为重要的可能是在选择之后要进行服务器的各种性能测试&#xff0c;是否适合项…