Ids4 认证保护 API 方案更新

时刻保持
学习的喜悦

可能你咋一看这个标题不知道什么意思,其实我也没想好怎么表达,因为是一个特别简单的小知识点。

先说下为什么突然说到了Ids4?

这几天大家都知道,我在视频《微服务之eShop讲解》,目前讲到了购物车微服务部分,看到了官方架构中用到了Ids4的认证平台,和保护资源Api,和我写的认证方案不一样,所以我就开始研究了下官方,发现了原因,所以想主要是一个项目更新的说明流水账,同时也是想再一次的强调官网的重要性。

再说下今天要说的内容是什么。

如果你经常看我的项目,或者跟着我的教程,肯定都知道我的BCVP项目,是集成了ASPNETCORE、VUE、IDS4三方的统一架构设计平台,而且之前的有一篇文章,我也说到了Ids4官网已经升级到了4.x——《【Ids4实战】最全的 v4 版本升级指南》。更新的内容还是很多的,绝大多数的更新还是ids4认证平台的,其实在其他的地方也有了些许的变化,今天说的就是关于受保护资源服务器的一个小更新,关于ProtectingAPIs这一章节的。

‍好啦,现在已经说明了来意,剩下的就是上代码了,下边提到的代码都是关于Blog.Core里的,自己可以更新查看。

1、之前版本是如何保护Api的

在Authentication_Ids4Setup.cs中,我定义了一个服务扩展,用来添加Ids4的认证服务,其中有两个部分,第一个部分就是添加认证服务:

services.AddAuthentication()

第二个部分就是相应的认证方案,只不过之前Ids4的3.x系列,有两个写法,

第一个就是基于AspNetCore服务的:

public class Startup
{public void ConfigureServices(IServiceCollection services){services.AddMvc();services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>{// 认证服务器的根路径options.Authority = "https://ids.neters.club";// API资源名options.Audience = "blog.core.api";});}public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory){app.UseAuthentication();app.UseMvc();}
}

还有一种是Ids4认证服务自己提供的一个处理程序方案:

public class Startup
{public void ConfigureServices(IServiceCollection services){services.AddMvc();services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme).AddIdentityServerAuthentication(options =>{// identityserver根路径options.Authority = "https://ids.neters.club";// API资源名options.ApiName = "blog.core.api";});}public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory){app.UseAuthentication();app.UseMvc();}
}

这两个用哪一个呢,官方更建议使用下边这个,是他们自己封装的,但是其中的核心,还是基于微软的JWT类库封装的,

Ids4自己封装的类库,给出的理由是这样的:

  • support for both JWTs and reference tokens

  • extensible caching for reference tokens

  • unified configuration model

  • scope validation

我就简单的翻译下,使用这种方案,可以同时支持JWT和referencetoken的两个方案,还针对后者做了缓存,scope验证,统一配置模型等等。

而且我也在Blog.Core使用了该方案:

书写代码:

 services.AddAuthentication(o =>{o.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;o.DefaultChallengeScheme = nameof(ApiResponseHandler);o.DefaultForbidScheme = nameof(ApiResponseHandler);}).AddIdentityServerAuthentication(options =>{options.Authority = Appsettings.app(new string[] { "Startup", "IdentityServer4", "AuthorizationUrl" });options.RequireHttpsMetadata = false;options.ApiName = Appsettings.app(new string[] { "Startup", "IdentityServer4", "ApiName" });options.SupportedTokens = SupportedTokens.Jwt;options.ApiSecret = "api_secret";})

但是这里有一个情况,就是必须添加ids4自己封装的nuget包:

<PackageReference Include="IdentityServer4.AccessTokenValidation" Version="3.0.1" />

这个nuget包也在GitHub上开源了,后来官方好像也发现了这个情况,既然要使用微软的,那就用吧,不用在api资源服务器里引用了,所以我们可以看这个GitHub仓库已经归档了:

而且在下边的README里也写了启用并停止更新了:

而且官方的最新文档里也悄悄的发生了变化。

2、最新版方案AddJwtBearer

从最新的Ids4官方文档https://docs.identityserver.io/en/latest/topics/apis.html中,也可以看出来,官方也已经取消了上边的那种方案,统一使用AddJwtBearer方法了,这里有两个好处:

1、可以和普通的jwt认证统一,因为之前是jwt用AddJwtBearer,ids4用的AddIdentityServerAuthentication。

2、可以取消Api资源服务中对Ids4的引入,比如那个nuget包。

所以,最终的代码是这样的:

 // 添加Identityserver4认证services.AddAuthentication(o =>{o.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;o.DefaultChallengeScheme = nameof(ApiResponseHandler);o.DefaultForbidScheme = nameof(ApiResponseHandler);}).AddJwtBearer(options =>{options.Authority = Appsettings.app(new string[] { "Startup", "IdentityServer4", "AuthorizationUrl" });options.RequireHttpsMetadata = false;options.Audience = Appsettings.app(new string[] { "Startup", "IdentityServer4", "ApiName" });}).AddScheme<AuthenticationSchemeOptions, ApiResponseHandler>(nameof(ApiResponseHandler), o => { });

只不过这里只支持JwtTokens的模式,如果想要支持referenceTokens,需要先引用包:

<PackageReference Include="IdentityModel.AspNetCore.OAuth2Introspection" Version="4.0.1" />

然后

services.AddAuthentication("token")// JWT tokens.AddJwtBearer("token", options =>{options.Authority = Constants.Authority;options.Audience = "resource1";options.TokenValidationParameters.ValidTypes = new[] { "at+jwt" };// if token does not contain a dot, it is a reference tokenoptions.ForwardDefaultSelector = Selector.ForwardReferenceToken("introspection");})// reference tokens.AddOAuth2Introspection("introspection", options =>{options.Authority = Constants.Authority;options.ClientId = "resource1";options.ClientSecret = "secret";});

好啦,暂时就这么多吧,可能有些凌乱,具体查看项目代码吧,最后还是那句话,官网很重要。

 



BCVP开发者社区推荐

欢迎你来

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

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

相关文章

dotNet Core 3.1 使用 Aspose (部署 Docker)

在之前的文章《dotNET Core中使用Aspose&#xff08;部署Docker&#xff09;》中介绍了在 dotNet Core2.1 中使用 Aspose &#xff0c;并部署到 Docker 中&#xff0c;现在 dotNET Core 升级到了 3.1 &#xff0c;Docker 镜像发生了变化&#xff0c;一些依赖的安装也有些变化。…

MySQL之一条Update的执行流程

文章目录1:执行的语句2:在更新操作中流程中特有的部分(1):redo log&#xff08;重做日志&#xff09;(2):binlog&#xff08;归档日志&#xff09;(3):Redo日志跟binlog日志的区别2:执行流程1:执行的语句 update T set c c 1 where ID 2;2:在更新操作中流程中特有的部分 (…

教你打入clr内部: 配置windows上的windbg,linux上的lldb

一&#xff1a;背景1. 讲故事前几天公众号里有位兄弟看了几篇文章之后&#xff0c;也准备用windbg试试看&#xff0c;结果这一配就花了好几天&#xff0c;(づ╥﹏╥)づ&#xff0c;我想也有很多跃跃欲试的朋友在配置的时候肯定会遇到这样和那样的问题&#xff0c;所以我觉得有必…

leetcode周赛6076. 表示一个折线图的最少线段数

气死爹了 用C过不去 换成Java 过了 一:题目 二:上码 class Solution {public int minimumLines(int[][] stockPrices) {Arrays.sort(stockPrices,(o1,o2)->o1[0]-o2[0]);int n stockPrices.length;if (n 1) return 0;int ans 1;for (int i 0; i < n-2; i) {int k1 …

使用代码片段的正确姿势,打造高效的vscode开发环境

全文3928字&#xff0c;阅读时间 10分钟&#xff0c;未来节约时间 15分钟/每天代码片段&#xff08;code snippet&#xff09; 相信大家都或多或少有接触过。在完成一个项目以后&#xff0c;往往都会写出许多有价值的代码&#xff0c;或是绞尽脑汁解决的难题&#xff0c;或是灵…

leetcode周赛6074. 字母在字符串中的百分比

这个简单题也比较狗 上午做的时候一直有个测试点不过 但是题目不给出什么测试点不过 原来是100这个答案 给跪了 一:题目 二:上码 class Solution { public:int percentageLetter(string s, char letter) {if (s.size() 0) return 0;int count 0;for (int i 0; i < s.si…

leetcode周赛6075. 装满石头的背包的最大数量

一:题目 二:上码 class Solution { public:/**思路:求差&#xff0c;将结果放到一个容器当中&#xff0c;然后的话&#xff0c;排序&#xff0c;*/int maximumBags(vector<int>& capacity, vector<int>& rocks, int additionalRocks) {vector<int> …

学完这篇依赖注入,与面试官扯皮就没有问题了。

IOC: Inversion Of Control 控制反转DI: Dependency Injection 依赖注入1.控制反转 Inversion Of Control 的前世今生1.1 IOC理论产生的背景讨论控制反转之前&#xff0c;先看看软件系统提出控制反转的前世今生。一个完整精密的软件系统&#xff0c;组件之间就像齿轮&…

SpringCloud微服之Nacos的学习

1:使用前提 第一步:解压启动Nocos SpringCloudAlibaba 推出了一个名为 Nacos 的注册中心&#xff0c;在国外也有大量的使用。 startup.cmd -m standalone 访问http://localhost:8848/nacos/ 第二步:服务注册 工程目录 在父工程中添加依赖 <dependency><groupI…

前端大佬谈国产开源:VUE 的成功在于社区运营

喜欢就关注我们吧&#xff01;近日&#xff0c;国内首个开源软件基金会 —— 开放原子基金会在深圳国际开源谷举办了 TOC 圆桌论坛。论坛上&#xff0c;基金会 TOC 之一、国内知名前端大佬贺师俊表达了一些有趣的观点&#xff0c;阐述了自己对于国内开源生态的见解。贺师俊认为…

停止精神内耗 每日分享

停止反复犹豫 作家脱不花曾说&#xff1a;“人总是有很多左右为难的事情&#xff0c;如果你在做与不做之间来回纠结&#xff0c;那就停止来回推演&#xff0c;立即去做” 所谓三思而后行 那么如果只停留在三思 那么所有的愿景都将成为遗憾 放弃脑海当中左右不定的想法 扔掉徘…

eShopOnContainers 知多少[12]:Envoy gateways

1. 引言在最新的eShopOnContainers 3.0 中Ocelot 网关被Envoy Proxy 替换。下面就来简要带大家了解下Envoy&#xff0c;并尝试梳理下为什么要使用Envoy替代Ocelot。2. Hello EnvoyENVOY IS AN OPEN SOURCE EDGE AND SERVICE PROXY, DESIGNED FOR CLOUD-NATIVE APPLICATIONS.En…

为啥 Response.Write 后,View就不渲染了?

一&#xff1a;背景 1. 讲故事前几天群里有一位朋友聊到&#xff0c;为什么我在 Action 中执行一句 Response.Write 之后&#xff0c;后续的 View 就不呈现了&#xff0c;如果脑子中没有画面&#xff0c;那就上测试代码&#xff1a;public class HomeController : Controller{p…

3. 无重复字符的最长子串(滑动窗口详解版)

一:题目 二&#xff1a;上码 class Solution {/**分析&#xff1a;1.滑动窗口问题2.何时更改窗口的起点位置当出现重复的时候 需要从重复的字符的下一个字符开始计算*/public int lengthOfLongestSubstring(String s) {if (s.length() < 1) {return s.length();}int slowIn…

121. 买卖股票的最佳时机

一:题目 二:上码 class Solution {// public int maxProfit(int[] prices) {// int max 0;// for (int i 0; i < prices.length; i) {// //求出i后面的最大值// int temp 0;// for (int j i 1; j < prices.length; j) {// …

IdentityServer4系列 | 快速搭建简易项目

一 、前言从上一篇关于 常见术语说明中&#xff0c;主要是对「IdentityServer4」的说明&#xff0c;以及其中涉及常见的术语的表述说明&#xff0c;包括对身份认证服务器、用户、客户端、资源以及各个令牌等进行对比区别说明。而在这一篇中&#xff0c;我们将尝试通过简单的方式…

136. 只出现一次的数字(hot100)

一:题目 二:上码 class Solution {public int singleNumber(int[] nums) {int ans -100;Arrays.sort(nums);for (int i 0; i < nums.length-1; i2) {if (nums[i] ! nums [i1]) {ans nums[i];break;}}return ans -100 ? nums[nums.length-1] : ans;} }

高并发项目Java是标配?.NET Core要将它拉下“神坛”!

电商的秒杀和抢购&#xff0c;对我们来说&#xff0c;都不是一个陌生的东西。然而&#xff0c;从技术的角度来说&#xff0c;这对于Web系统是一个巨大的考验。当一个Web系统&#xff0c;在一秒钟内收到数以万计甚至更多请求时&#xff0c;系统的优化和稳定至关重要。缓存技术是…

141. 环形链表(hot100)

一:题目 二:上码 /*** Definition for singly-linked list.* class ListNode {* int val;* ListNode next;* ListNode(int x) {* val x;* next null;* }* }*/ public class Solution {public boolean hasCycle(ListNode head) {ListNode fa…

程序员修神之路--分布式系统使用网关到底是好还是坏?

“灵魂拷问分布式系统需要统一的网关吗&#xff1f;网关会带来哪些优势&#xff1f;引入网关会带来灾难吗&#xff1f;分布式系统的设计大体上分为中心化和非中心化&#xff0c;像现在流行的微服务模式&#xff0c;本质上是把各种业务拆分为独立的进程来实现业务的扩展性。伴随…