【实战 Ids4】║ 控制台密码模式搭配Ocelot网关

(此岁只能云赏樱了)

书接上文,这些天一直在研究IdentityServer4(下文简称Ids4)框架,发现有很多有意思,或者说比我想象中的知识点,可扩展的多,所以比较开心能钻研进去,就像当时学习ASP.NET Core一样,越学越感觉有意思的,我自认为ASP.NET Core已经学的基本出师了,希望Ids4我也能学到出师,毕竟要干一件事就要做好它。

在之前的公众号文章中呢,我已经对多个客户端进行了迁移,比如JS模式,MVC模式:

【实战 Ids4】║ 客户端、服务端、授权中心全线打通!

【实战 Ids4】║ 又一个项目迁移完成(MVC)

在我的开篇讲中,一共说到了平时开发常见的模式有以下几个:

简化模式和授权码模式已经说完了,分别对应了JS客户端和MVC客户端,那今天就说一下第三种密码授权模式——控制台调用,之前之所以没说,是因为太简单了,那今天正好配合着Ocelot 网关一起讲讲,也不算滥竽充数。

正文开始。

1、认证中心配置客户端

这一步很简单,我们只需要增加一个Client即可:

 // 控制台客户端 密码模式new Client{ClientId = "Console",ClientSecrets = { new Secret("secret".Sha256()) },AllowedGrantTypes = new List<string>(){GrantTypes.ResourceOwnerPasswordAndClientCredentials.FirstOrDefault(),},AllowedScopes = new List<string>{"blog.core.api"}}

简单来说,是允许一个名为Console的客户端,使用密码模式,通过我们的认证中心,来访问blog.core.api的资源服务器,具体什么意思,相信应该都能看的懂,这里不赘述。

2、创建控制台客户端

上边我们已经配置好,下边我们就直接创建对应的客户端来测试吧。

打开vs2019,创建NetCore的控制台应用程序

创建好后,引用 IdentityModel Nuget包

 <ItemGroup><PackageReference Include="IdentityModel" Version="4.1.1" /></ItemGroup>

接下来,就是简单写代码了

 static async Task Main(string[] args){using var client = new HttpClient();var discoResponse = await client.GetDiscoveryDocumentAsync("http://localhost:5004");if (discoResponse.IsError){Console.WriteLine(discoResponse.Error);return;}var tokenResponse = await client.RequestPasswordTokenAsync(new PasswordTokenRequest{Address = discoResponse.TokenEndpoint,ClientId = "Console",// 客户端idScope = "blog.core.api",// 对应的受保护资源服务器idClientSecret = "secret",UserName = "laozhang",// 这里的用户名密码,是我SeedData的时候导入的Password = "BlogIdp123$InitPwd"});if (tokenResponse.IsError){Console.WriteLine(tokenResponse.Error);return;}Console.WriteLine(tokenResponse.Json);client.SetBearerToken(tokenResponse.AccessToken);// 获取access_token后,向资源服务器发起请求var response = await client.GetAsync("http://localhost:8081/api/blog/1");Console.WriteLine(response.IsSuccessStatusCode ?$"{response.StatusCode} {await response.Content.ReadAsStringAsync()}" :response.StatusCode.ToString());}

我已经对部分地方加了注释,相信你应该能看的懂,简单来说,就是通过账号信息向Ids4认证中心(5004)发起请求,获取到access_token,然后带上这个token向资源服务器(8081)发起请求,没错就是我们的Blog.Core项目,注意这个代码是is4分支的,不是master的。

然后还要注意Blog.Core的授权地址要改成localhost:5004,而不是ids.neters.club。

    "ApiName": "Blog.Core","IdentityServer4": {"AuthorizationUrl": "https://ids.neters.club"}

3、开启三端,联调测试

这里的三端分别是:认证中心、资源服务器、还有刚刚创建的控制台。

这里肯定没问题,我简单放两个结果图:

(获取到了token)

(访问资源服务器,返回结果)

(为表示正确性,我这里贴出来api确实是加密的)

那现在我们的控制台密码授权模式已经说完了,那接下来就简单说一下如果使用Ocelot来实现api网关吧。

4、创建Ocelot API网关

再创建一个空的API项目,端口设置3000

添加配置数据

{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"AllowedHosts": "*","ReRoutes": [{"DownstreamPathTemplate": "/api/blog/1",// 下游api项目的接口"DownstreamScheme": "http","DownstreamHostAndPorts": [{"Host": "localhost","Port": 8081 // 下游api项目,可以配置多个}],"UpstreamPathTemplate": "/api/blog/1",// 自定义模板"UpstreamHttpMethod": [ "Get" ]}]
}

引用Ocelot的Nuget包

<ItemGroup><PackageReference Include="Ocelot" Version="14.1.0" />
</ItemGroup>

注册服务和添加中间件

public void ConfigureServices(IServiceCollection services)
{services.AddControllers();services.AddOcelot();
}public void Configure(IApplicationBuilder app, IWebHostEnvironment env){app.UseRouting();app.UseOcelot();app.UseEndpoints(endpoints =>{endpoints.MapControllers();});}

我们发起请求访问

当然,这是很正常的,证明我们已经成功的把资源服务器的8081,交给了3000的Ocelot网关了。

5、修改控制台请求

刚刚我们的控制台客户端,请求的是资源服务器,那我们现在改成API网关,看是否依然可以:

没错,依然是可行的。

到了这里,我们已经成功的学会了:

1、如何使用密码授权模式;

2、如何控制台客户端发起请求;

3、如何使用Ocelost API网关;

4、如何基于网关进行Ids4的授权认证操作;

好啦,今天就到这里吧,窗外阳光明媚,春暖花开。

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

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

相关文章

《C++ Primer》7.3.3节练习

练习7.31: 满足题意的程序如下所示&#xff1a; class X;//声明类型X class Y//定义类型Y {X* x; }; class X//定义类型X {Y y; };类X的声明称为前向声明&#xff0c;它向程序中引入了名字X并且指明X是一种类类型。对于类型X来说&#xff0c;此时我们已知它是一个类类型&#…

.NET Core 如何生成信用卡卡号

点击上方蓝字关注“汪宇杰博客”导语上个月我写了《.NET Core 如何验证信用卡卡号》&#xff0c;不少朋友表示挺有兴趣。在金融科技行业的实际工作中&#xff0c;通常还需要生成信用卡卡号用来测试&#xff0c;今天我就来教大家如何生成信用卡卡号。上回的改进上篇文章写完后&a…

python怎么爬虎牙_使用python爬虫框架scrapy抓取虎牙主播数据

前言本文利用python的scrapy框架对虎牙web端的主播、主播订阅数、主播当前观看人数等基本数据进行抓取&#xff0c;并将抓取到的数据以csv格数输出&#xff0c;以及存储到mongodb中思路观察虎牙网站后确认所有频道url都在www.huya.com/g中的&#xff0c;而主播房间数据则是ajax…

《C++ Primer》7.3.4节练习

练习7.32: 要想让clear函数作为Screen的友元&#xff0c;只需要在Screen类中做出友元声明即可。本题的真正关键之处是程序的组织结构&#xff0c;我们必须首先定义Window_mgr类&#xff0c;其中声明clear函数&#xff0c;但是不能定义它&#xff1b;接下来定义Screen类&#xf…

.NET Core开发实战(第29课:定义仓储:使用EF Core实现仓储层)--学习笔记

29 | 定义仓储&#xff1a;使用EF Core实现仓储层首先定义仓储层的接口&#xff0c;以及仓储层实现的基类&#xff0c;抽象类仓储层的接口namespace GeekTime.Infrastructure.Core {/// <summary>/// 包含普通实体的仓储/// 约束 TEntity 必须是继承 Entity 的基类&#…

ueditor单图上传iframe跨域_UEditor单图上传(simpleupload)跨域问题解决方案

代码实现首先我们需要在ueditor.all.js文件中找到原本的单图上传部分的代码搜索关键字 simpleupload&#xff0c;如下图所示&#xff1a;然后找到上传图片的代码片段&#xff0c;如下图所示&#xff1a;然后把 domUtils.on的 input 绑定的事件注释掉或删除掉替换成以下代码:inp…

StringBuilder内存碎片对性能的影响

TL;DR:StringBuilder内部是由多段 char[]组成的半自动链表&#xff0c;因此频繁从中间修改 StringBuilder&#xff0c;会将原本连续的内存分隔为多段&#xff0c;从而影响读取/遍历性能。连续内存与不连续内存的性能差&#xff0c;可能高达 1600倍。背景用 StringBuilder的用户…

java 双击_利用java开发一个双击执行的小程序

之前我们利用java写了很多东西&#xff0c;但是好像都没有什么实际意义。因为有意义桌面小程序怎么都得有个界面&#xff0c;可是界面又不太好搞。或者 了解到这一层的人就少之又少了。呀&#xff0c;是不是还得开辟一些版面来介绍awt和 swing。。。算了 先把这个 双击执行的小…

开发人员如何学习 Kubernetes

虽然“容器编排平台”还没有被整个行业大范围采用&#xff0c;但在这一领域 Kubernetes 已经战胜其他选手&#xff0c;成为了事实标准。近两年的 Web 开发技术社区&#xff0c;随便打开一两个群&#xff0c;你都能看到人们在谈 Kubernetes。很多开发人员&#xff0c;包括曾经的…

安装 java decompiler_Eclipse离线安装Java Decompiler插件(反编译)

Java Decompiler是Java语言的反编译工具&#xff0c;具体介绍见博客Java Decompiler(Java反编译工具)1、下载插件Eclipe的Java Decompiler插件名为JD-Eclipse&#xff0c;2、安装插件Ecipse安装JD-Eclipse(即Java Decompiler)插件步骤如下&#xff1a;打开Help --> Install …

给 ABP vNext 应用安装私信模块

在上一节五分钟完成 ABP vNext 通讯录 App 开发 中&#xff0c;我们用完成了通讯录 App 的基础开发。这本章节&#xff0c;我们会给通讯录 App 安装私信模块&#xff0c;使不同用户能够通过相互发送消息&#xff0c;并接收新私信的通知。在章节的最后&#xff0c;笔者将演示模块…

《C++ Primer》7.5.2节练习

练习7.41: #include <iostream> #include <string> using namespace std;class Sales_data {friend std::istream &read(std::istream &is, Sales_data &item);friend std::ostream &print(std::ostream &os, const Sales_data &item);pu…

零基础玩视频号?创作运营变现,你要的干货都在这了!

点击蓝字“大白技术控”关注我哟加个“星标★”&#xff0c;每日良时&#xff0c;好文必达&#xff01;不少小伙伴应该已经听说过视频号这个新功能了&#xff0c;视频号是微信内测的短视频功能&#xff0c;本人已经在视频号里刷了2个月了。3月中旬正式开通了视频号 「大白技术控…

Asp.Net Core 中IdentityServer4 实战之 Claim详解

一、前言由于疫情原因&#xff0c;让我开始了以博客的方式来学习和分享技术&#xff08;持续分享的过程也是自己学习成长的过程&#xff09;&#xff0c;同时也让更多的初学者学习到相关知识&#xff0c;如果我的文章中有分析不到位的地方&#xff0c;还请大家多多指教&#xf…

程序员还有35岁的坎吗?

昨天晚上和多年未见的前同事聊天&#xff0c;提到了程序员的年龄歧视问题&#xff1a;自己年龄也 30 出头了&#xff0c;在思考 IT 届流传的 35 岁是一个坎的问题&#xff1b;开始注重提升管理能力&#xff0c;担心35岁之后&#xff0c;一线写代码的岗位不能胜任&#xff1b;公…

java 左移 返回值_java左移右移运算符详解

在阅读源码的过程中&#xff0c;经常会看到这些符号<< &#xff0c;>>&#xff0c;>>>&#xff0c;这些符号在Java中叫移位运算符&#xff0c;在写代码的过程中&#xff0c;虽然我们基本上不会去写这些符号&#xff0c;但需要明白这些符号的运算原理&…

人与人的差距在于认知

作者介绍findyi&#xff0c;腾讯、360码农&#xff0c;前哒哒少儿英语技术VP&#xff0c;现任土豆教育CTO。工作和生活中不光要埋头干活&#xff0c;还要抬头看天。思考总结方法论是提升认知的必备途径&#xff0c;是将碎片化知识总结为动态的智慧的过程。认知有多重要&#xf…

.NET5来了你别慌

近日微软.Net大咖Scott在博客中对外宣传.NET5首个预览版&#xff0c;并且我们可以通过微软的官网下载SDK5和运行库。很多朋友感觉.NetCore3.1还没搞明白&#xff0c;.NET5就来了感觉一下子慌了神。在这里我提醒朋友们&#xff0c;瞬息万变的世界中&#xff0c;总有相对不变的真…

java8 stream 最大值_JDK8-Stream流常用方法

Stream流的使用流操作是Java8提供一个重要新特性&#xff0c;它允许开发人员以声明性方式处理集合&#xff0c;其核心类库主要改进了对集合类的 API和新增Stream操作。Stream类中每一个方法都对应集合上的一种操作。将真正的函数式编程引入到Java中&#xff0c;能 让代码更加简…

周三晚6点半!盛派首席架构师“苏老师”在线解密内部系统框架!

工作中有些事&#xff0c;看起来只用一会会儿就能完成&#xff0c;但真正完成起来&#xff0c;总会遇到一些意想不到的困难&#xff01;你一定碰到过这样的情况——开发时间 2 周的项目&#xff0c;搭框架就要用 1 周&#xff0c;刚开发完&#xff0c;各种调试和修 bug又花去 2…