IdentityServer4 之Client Credentials走起来

前言

API裸奔是绝对不允许滴,之前专门针对这块分享了jwt的解决方案(WebApi接口裸奔有风险);那如果是微服务,又怎么解决呢?每一个服务都加认证授权也可以解决问题,只是显得认证授权这块冗余,重复在搞事情;IT大佬肯定容忍不了,对于微服务架构,统一的认证授权中心那是必须的。

随着.NetCore的发布,IdentityServer4随之而出,是.Net Foundation的成员之一,专门针对.NetCore而出的认证授权框架,当前.Net圈是比较火的啦;再配上微服务认证授权的必要性,我决定以此开始入手进行微服务架构学习分享;

主要的学习分享思路为敲代码为向导,如果遇到相关理论概念,结合代码案例进行解释,不在单独针对理论知识整理相关文章(主要是担心归纳总结不好,让小伙伴疑惑,所以就想着结合应用案例解释比较容易理解)。

正文

IdentityServer4 主要的功能就是认证和授权,其他功能这里先假装不知道;主要目的就是想用其统一保护各个微服务的接口;先来理解一下认证和授权:

  • 授权(Authorization):在用户身份认证通过之后,授予用户访问资源的过程或是用户授予第三系统访问自己资源的过程,资源可能是个人信息、文件、数据、接口等;OAuth2是现在比较火的授权标准,对于授权流程,后续会举例说明;

    在公司,假如小伙伴是领导,在出差或休假的时候,通常会通过口头、邮件、信息等方式将一些工作临时委托给某人处理,比如签字、参会等,这个过程叫做授权,如果没有授权,签字无效,也不能随意参会;

  • 认证(Authentication):用户身份认证,可以将其理解为登录;系统验证身份凭据是否合法,比如用户名/密码、人脸识别等方式;OpenId Connect是目前比较流行的身份认证标准协议,OpenID是一个去中心化的网上身份认证系统,OpenID Connect是在OAuth2基础进行扩展,增加身份认证和相关身份标识信息;

    稍微有点规模的公司,通常都有自己的办公楼,有专门的保安人员,管控非公司人员的进入, 如果是公司人员,刷卡识别即可进入,如果是非公司人员需要登记个人信息确认才能进入,这个过程可以理解为身份认证;只有验证信息之后才能进入公司。

IdentityServer4 已经将OpenID Connect和OAuth 2.0封装实现,开发者开箱即用,无需再重新自己实现细节,但如果有需要,小伙伴可以在IdentitySever4基础进行扩展个性化需求;

在授权过程中,根据应用场景不同,有四种授权模式可以选择,如下:

  1. Authorization Code(授权码):最完整的授权模式,也是相对比较安全的模式,适用于有后台的应用程序,如MVC项目;

  2. Implicit(简化模式):简化授权码模式,适用于无后台的应用程序,如前后端分离项目;

  3. Resource Owner Password Credentials(资源所有者密码):直接通过用户名和密码获得授权,这种适用于高度信任的应用,因为需要输入用户名和密码,安全泄露风险高;

  4. **Client Credentials(客户端模式) **:这是无用户操作模式,适用于机器对机器的对接,没有用户干预的应用,如后台任务调度应用,采集数据应用等;

  5. 混合模式:以上四种的组合。

其他理论先不说了,我们边撸码边聊,这样记忆深刻一点,这里就从最简单的Client Credentials开始:

Client Credentials 客户端授权模式

客户端模式没有用户,就只是单纯的机器对机器的交互,大概的流程如下:

流程简要说明:

  1. 首先客户端带上凭据向授权服务器获取AccessToken,这里的客户端凭据是提前在授权服务器上备案过的;

  2. 授权服务器验证客户端凭据,成功之后直接返回AccessToken;

  3. 客户端在带上AccessToken访问资源服务器;

  4. 资源服务器正常返回结果,如果没有AccessToken是不能访问受保护资源的;

来,结合流程看看代码怎么实现,一步一步来:

>>>先创建API项目---资源服务器
  1. 创建一个OrderController,并在里面新增一个Orders 接口,接口没有进行保护;

  2. 接口没有进行保护,可以任意访问,如下:

>>>再创建认证授权中心项目---授权服务器,将资源服务保护起来

以上的API接口裸奔是有风险的,现在需要统一的认证授权中心进行保护,如下:

  1. 新创建一个API项目,并引入IdentityServer4包,并在内存中模拟相关数据,方便测试;

    术语解释

    ApiScope:就是一个作用域范围,生成的Token只能访问指定范围的资源;

    Client:这里的客户端就是应用,比如MVC项目、纯前端项目、Winfrom/WPF、APP等,必须首先在授权服务器中进行备案并获得授权服务器分配的标识和密码,后续用于获取AccessToken;

  2. 模拟数据准备好了,就在Startup中进行对应的注入和配置,并开启中间件,如下:

  3. 这样就初步完成授权服务器的搭建,这里监听的端口改为6100了,用Postman先来测测是否能正常获取Token,如下:


    可能有新手小伙伴会问,咋知道是这个地址能获取token的?小伙伴可以在浏览器中输入以下链接,即可看见授权服务器的相关信息(授权服务器地址+/.well-known/openid-configuration):

  4. 授权服务器已经好了,准备将资源服务器接入到授权服务器,对API接口进行保护(ApiDemo项目中),如下:


    注:ApiDemo项目中需要Microsoft.AspNetCore.Authentication.JwtBearer包,因为项目是基于.NetCore3.1的,所以这里引用的包版本为3.1.10。

  5. 然后在接口上面加上[Authorize]特性,将接口保护起来,看运行效果如下:

  6. 在Postman中测试,先获取AccessToken,然后将获取的AccessToken加入到Header中请求资源服务器中受保护的API,如下:

>>>真实客户端访问受保护API---控制台

建一个控制台项目,具体步骤如图:

这里就不用文字说明步骤,小伙伴一边看代码,一边看注释,这样应该比较清晰点:

static async Task Main(string[] args)
{// 1. 创建一个HttpClient用于请求var client = new HttpClient();// 2. 获取授权服务器的相关信息,IdentityModel已经将其封装好了var disco = await client.GetDiscoveryDocumentAsync("http://localhost:6100");// 3. 检查是否请求错误if (disco.IsError){// 错误就打印错误信息,然后直接返回Console.WriteLine(disco.Error);return;}// 4. 通过授权服务分配的标识,向授权服务器请求AccessTokenvar tokenResp = await client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest{// 指定获取token的地址,IdentityModel进行封装,直接使用即可Address = disco.TokenEndpoint,// 指定授权服务器分配的客户端标识ClientId = "client",// 指定授权服务器分的客户端密码ClientSecret = "ordersecret"});// 5. 检查获取Token是否成功if (tokenResp.IsError){// 如果失败,打印错误消息并返回Console.WriteLine(tokenResp.Error);return;}// 6. 创建一个请求API资源的HttpClientvar apiClient = new HttpClient();// 7. 将获取到的Token以Bearer的方案设置在请求头中apiClient.SetBearerToken(tokenResp.AccessToken);// 8. 向资源服务器中请求受保护的APIvar contentResp = await apiClient.GetAsync("http://localhost:5000/api/Order");// 9. 打印对应的消息if (contentResp.IsSuccessStatusCode){var content = await contentResp.Content.ReadAsStringAsync();Console.WriteLine(JArray.Parse(content));}else{Console.WriteLine(contentResp.StatusCode);}Console.ReadLine();
}

到这里离完成还差一步了,什么,资源不是保护了吗,受保护资源也能正常访问了,还差哪一步?

在授权服务器模拟备案客户端的时候,是不是指定了访问资源的作用域,也就是说,备案过的客户端只能访问被授权的API资源,而现在拿到的AccessToken都能访问资源服务器中所有受保护的资源,那是因为资源服务器中的API资源没有限制作用域访问,而在实际项目中,并不是拿到AccessToken就能随便访问,需要做限制,继续往下看↓↓↓

假如指定的scope值和客户端在授权服务器中备案时设置的不一样,就算获取到AccessToken也不能正常访问资源,会报403错误,这里我不截图,小伙伴下去试试。

可能小伙伴会比较急,这都是啥玩意,全是硬编码,垃圾文; 别别别,说好的学习分享嘛,一步一个脚印来嘛,最终肯定是小伙伴想要的,也是我学习的目标;

关于客户端凭据生成的Token,在jwt.io网站解析看看,记录一下,看看后面有用户参与的情况,生成的Token解析出来会有什么不同呢,先上个图(图中解析出来的属性之前在WebApi接口裸奔有风险有说过):

总结

从这篇开始,后续会尽快更新学习分享,小伙伴们加入一起学习,一起讨论。下一篇说说Resource Owner Password Credentials.

一个被程序搞丑的帅小伙,关注"Code综艺圈",跟我一起学~

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

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

相关文章

读数据库遇到空就进行不下去_如何保证缓存与数据库的双写一致性?

作者:你是我的海啸来源:https://blog.csdn.net/chang384915878分布式缓存是现在很多分布式应用中必不可少的组件,但是用到了分布式缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据…

获取html滚动条位置,pc和移动端获取滚动条的位置

html5碰撞小球模拟这里根据动量守恒和能量守恒定理来计算小球的位置,从而模拟完全弹性碰撞下的小球运行轨迹. html代码: /p>spring jdbctemplate源码跟踪闲着没事,看看源码也是一种乐趣! java操作数据库的基本步骤都是类似的: 1. 建立数据库连接 2. 创建Connection 3. 创建s…

Windows Terminal 新手入门

翻译自 Kayla Cinnamon 2020年12月17日的文章《Getting Started with Windows Terminal》[1]安装Windows Terminal(Windows 终端)有两个不同的版本:Windows Terminal[2] 和 Windows Terminal 预览版[3]。两个版本都可以从 Microsoft Store 和…

html绑定按键图片移动,如何使用JS实现用键盘控制图片移动呢?

html xmlnshttp://www。w3。org/1999/xhtml headtitle标题页-学无忧(www。xue51。com)/title/headscript languageJavaScriptvar key0var timerfunction setObj(){ ietype (document。layers) ? 1 : 0; //判断浏览器类型 divObj (ietype)? document。mydiv : mydiv。style …

5120v2怎么配置web登陆_阿里企业邮箱如何配置和添加到第三个电子邮件客户端中?...

我们常见的第三方邮箱客户端有:Outlook、Thunderbird、Live mail、Web客户端、畅邮(DM Pro)客户端等,下面用畅邮(DM Pro)为例。流程一.配置信息企业邮箱POP、SMTP、IMAP地址列表如下:&#xff0…

赛尔号什么时候支持html5,赛尔号三全能时代即将来临 你准备好了吗

大新闻!赛尔号刻印系统即将迎来改版升级!更简单的刻印强化方式,更清晰的刻印等级机制,强化满级还有额外属性加成!想知道具体情况如何?下面柚子姐姐就为大家介绍本次刻印系统改版升级后的全新变化吧&#xf…

银河麒麟V10入选2020中国十大科技新闻

日前,中央电视台、中央人民广播电台、中国国际广播电台、中国国际电视台联合评选了“2020十大国内科技新闻”,“银河麒麟操作系统V10”与其他国家科技领域重大成榜上有名。8月13日,银河麒麟操作系统V10发布后,央视新闻、人民日报、…

vue 调用mutation方法_Vuex白话教程第三讲:Vuex旗下的Mutation

文 | 大宏写在前面上一讲「Vuex 旗下的 State 和 Getter」,告诉了我们怎么去使用仓库 store 中的状态数据。当然,光会用肯定还不够,大部分的应用场景还得对这些状态进行操控,那么具体如何操控呢,这就是这一讲要说的重点…

微型计算机硬件采用什么,微型计算机的硬件系统包括什么?

微型计算机的硬件系统包括cpu、存储器、输入设备、输出设备四大部分。CPU是计算机硬件的核心,控制着整个计算机系统的工作;存储器是计算机中的记忆存储部件;输入设备是计算机与用户或其他设备通信的桥梁;输出设备是计算机硬件系统…

如何在 C# 中使用 反射

C# 中的 反射 常用于在程序的运行时获取 类型 的元数据,可获取的信息包括已加载到进程中的 程序集 和 类型 信息,它和 C 中的 RTTI(Runtime Type Information) 的作用是差不多的。为了能够使用反射,需要在项目中引用 S…

echarts迁徙图 vue_如何快速在Vue中实现流向图或迁徙图?

原标题:如何快速在Vue中实现流向图或迁徙图?我们经常在一些新闻报道和商业杂志上看到运用地图来展示商业现象的做法。这样利用地图来反映和分析数据的形式,叫数据地图,它可以直观的表达出数据之间的空间关系。在数据地图中&#x…

霍纳法树形流图中处理机p个数_2009系统结构试卷答案

一.单项选择题(共10分,每选1分)1.与流水线最大吞吐率高低有关的是(C)A.各个子过程的时间B.最快子过程的时间C.最慢子过程的时间D.最后子过程的时间2.在流水机器中,全局相关是指(D)A.先写后读相关B.先读后写相关C.指令相关D.由转移指令引起的相…

html文件上传添加额外参数,bootstrap-fileinput组件在上传时传递额外参数

解决方法关键的配置参数是uploadExtraData具体的代码如下://获得额外参数的方法fodderType function() {return $("#fodderTypeSelect").val();};//初始化fileinput控件(第一次初始化)function initFileInput(ctrlName, FileExtensions, fileSize) {var …

什么是ASP.NET Core静态Web资产?

What are ASP.NET Core Static Web Assets?HostBuilder.ConfigureWebHostDefaults()中发生了很多隐藏的魔术(最终称为ConfigureWebDefaults)。 我想更好地了解它,因为我找不到有关它的文档。此代码似乎正在加载一些静态文件。什么是静态网络资产,为什么…

计算机基础知识教案1,计算机基础知识教案一

计算机基础知识教案一 秦皇岛外国语职业学院教案首页 年 月 日 学科 计算机基础 年级 专一 课题 计算机基础知识 教具 课时分配 2课时 教学目的 1. 了解计算机的发展、特点和应用 2. 掌握计算机的系统组成 3. 掌握各个逻辑部件性能指标和作用 教学重点、…

C# 9 新特性——init only setter

C# 9 新特性——init only setterIntroC# 9 中新支持了 init 关键字,这是一个特殊的 setter,用来指定只能在对象初始化的时候进行赋值,另外支持构造器简化的写法,Target-typed new expression 在已知类型的情况下可以使用 new() 来…

时间戳计算机网络,时间戳

时间戳(Timestamp)[编辑]什么是时间戳时间戳是指使用数字签名技术对包含原始文件信息、签名参数、签名时间等信息构成的对象进行数字签名而产生的数据,用以证明原始文件在签名时间之前已经存在。通过使用如网络时间协议(NTP)的机制,计算机维系准确的当前…

乔安监控云存储_智能运维丨全栈监控,护航云上业务

自2006年至今,云计算商用领域已经历了十余载的发展。云也从概念普及进入到广泛应用阶段,云服务变成了像水电一样的基础服务,已经是行业共识。云发展速度快、成长空间大,监控场景复杂最新Gartner的报告预测到2019年公有云市场将达到…

阿星Plus:基于abp vNext开源一个博客网站

作为微软最早迈向开源的重要软件之一,.NET 5的发布具有重要意义!微软希望 .NET Framework 开发者能够迁移他们的代码和应用到 .NET 5.0 上,为明年发布的 .NET 6.0 将 Xamarin 开发者过渡到统一平台奠定基础。这里推荐一个.NET Core 3.1 开源的…

html 保存文件指定路径,78.上传文件及在服务器保存文件到任意路径

上传文件到服务器是一个常用的操作,而在服务器上保存文件就需要多多用心了。因为你不可能只在一个路径里保存文件,所以需要实践一下保存文件到任意位置。当然,前提是你的应用程序有这样的操作权限。首先建立一个main.go文件,作为项…