Envoy实现.NET架构的网关(四)集成IdentityServer4实现OAuth2认证

.NET网关与Gateway实战-Envoy与kong课程

456965534c940c79fedd944489e41772.png

什么是OAuth2认证

简单说,OAuth 就是一种授权机制。数据的所有者告诉系统,同意授权第三方应用进入系统,获取这些数据。系统从而产生一个短期的进入令牌(token),用来代替密码,供第三方应用使用。

而IdentityServer4就是一个开源的OAuth2认证系统。网关与IdentityServer4集成之后,我们可以避免为内部的每个微服务集成IdentityServer4,可以避免很多重复的工作,而这也是网关的一个重要优势。

新建IdentityServer4服务

1新增WebApi,并引用Nuget包IdentityServer4

2.新增校验证书,其中的证书文件通过openssl创建

     2.1安装生成证书程序:https://slproweb.com/products/Win32OpenSSL.html(对应操作系统)

     2.2找到openssl安装位置生成证书,Country Name (2 letter code) [AU]:跳过所有步骤

openssl req -newkey rsa:2048 -nodes -keyout chester.key -x509 -days 365 -out chester.cer
openssl pkcs12 -export -in chester.cer -inkey chester.key -out chester.pfx

3.新增配置信息

public class Config{public static IEnumerable<ApiResource> GetApiResources(){return new List<ApiResource>{new ApiResource("api1", "我的第一个API"){UserClaims ={JwtClaimTypes.Audience},Scopes = new List<string>{"api"},}};}public static IEnumerable<Client> GetClients(){return new List<Client>{new Client{ClientId="client",//定义客户端IDClientSecrets={new Secret("secret".Sha256())//定义客户端秘钥},AllowedGrantTypes = GrantTypes.ResourceOwnerPassword,//授权方式为用户密码模式授权,类型可参考GrantTypes枚举AllowedScopes={ "api" }//允许客户端访问的范围}};}public static IEnumerable<ApiScope> ApiScopes =>new ApiScope[] { new ApiScope("api") };public static IEnumerable<IdentityResource> GetIdentityResources(){return new IdentityResource[]{new IdentityResources.OpenId()};}}

4.注入IdentityServer4

public void ConfigureServices(IServiceCollection services){services.AddIdentityServer()//注册服务//.AddDeveloperSigningCredential().AddSigningCredential(new X509Certificate2("chester.pfx","123456") ).AddInMemoryApiResources(Config.GetApiResources())//配置类定义的授权范围.AddInMemoryClients(Config.GetClients())//配置类定义的授权客户端.AddInMemoryApiScopes(Config.ApiScopes).AddTestUsers(new List<TestUser> { new TestUser { Username = "Admin", Password = "123456", SubjectId = "001", IsActive = true } });//模拟测试用户,这里偷懒了,用户可以单独管理,最好不要直接在这里Newservices.AddControllers();}

5.开启IdentityServer4中间件

app.UseIdentityServer();//添加中间件

6.然后启动IdentityServer4服务

845811b42b5b7037be64c6c11f2da5ea.png

配置Envoy

我们需要用到Envoy的envoy.filters.http.jwt_authn,需要注意的有以下几点

  • Envoy的过滤器加载是自上而下的,因此我们需要将此过滤器放到envoy.filters.http.router前

  • 另外我们需要在配置文件中配置jwt的jwks地址/.well-known/openid-configuration/jwks,jwks是JSON Web密钥集—一种用于共享公钥的JSON表示法,用于验证JWT签名

  • 并且我们需要配置ids4服务的cluster。

具体配置如下,需要注意的地方已标红

admin:address:socket_address:protocol: TCPaddress: 0.0.0.0port_value: 9902
static_resources:listeners:- name: listener_0address:socket_address:protocol: TCPaddress: 0.0.0.0port_value: 10000filter_chains:- filters:- name: envoy.filters.network.http_connection_managertyped_config:"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManagerscheme_header_transformation:scheme_to_overwrite: httpstat_prefix: ingress_httproute_config:name: local_routevirtual_hosts:- name: local_servicedomains: ["*"]routes:- match:prefix: "/"route:host_rewrite_literal: 192.168.43.94cluster: service_envoyproxy_iohttp_filters:- name: envoy.filters.http.jwt_authntyped_config:"@type": type.googleapis.com/envoy.extensions.filters.http.jwt_authn.v3.JwtAuthenticationproviders:jwt_provider:issuer: "http://192.168.43.94:7000"audiences:- "api1"forward: trueremote_jwks:http_uri:uri: "http://192.168.43.94:7000/.well-known/openid-configuration/jwks"cluster: jwtservertimeout: 5srules:- match:prefix: "/"requires:provider_name: jwt_provider- name: envoy.filters.http.routerclusters:- name: jwtserverconnect_timeout: 0.25stype: STRICT_DNSlb_policy: ROUND_ROBINload_assignment:cluster_name: jwtserverendpoints:- lb_endpoints:- endpoint:address:socket_address:address: 192.168.43.94port_value: 7000- name: service_envoyproxy_ioconnect_timeout: 30stype: strict_dns# Comment out the following line to test on v6 networksdns_lookup_family: V4_ONLYlb_policy: ROUND_ROBINload_assignment:cluster_name: service_envoyproxy_ioendpoints:- lb_endpoints:- endpoint:address:socket_address:address: 192.168.43.94port_value: 5000

启动envoy

docker run --rm -it -p 9902:9902 -p 10000:10000 -v D:/gateway/envoy/config/static/:/etc/envoy/ -v D:/gateway/envoy/logs:/logs envoyproxy/envoy-dev  -c /etc/envoy/envoy-jwt.yaml

验证jwt

我们直接访问http://192.168.43.94:10000/Name,不携带token,可以看到请求被拒绝,返回401

6f3f962bfb5c30b2adcab0608f5eea0c.png

 下面我们调用ids4的/connect/token接口获取token

1ef6b68175d106907303b480d3fb1098.png

将获取到的token放到Name接口的Header里,再次调用成功!!!

2db58a948161db819543c7403c65609c.png

至此,我们通过Envoy+IdentityServer4实现了网关的JWT认证,可以节省内部微服务与IdentityServer4重复的集成工作,实现了统一处理认证逻辑。

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

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

相关文章

如何通过CCIE实验考试

CCIE全称Cisco Certified Internetwork Expert.既然敢称expert那应该水平不低。&#xff08;当然那个MCSX的也敢说是expert&#xff0c;可惜现在有越来越多的初学者一两个月就搞定了&#xff0c;已经都泛了&#xff09;.Cisco的考试一向比较严谨&#xff08;当然现在CCNA系列&a…

宏在使用过程余函数的区别1

#include<stdio.h>#define MAX(X,Y) ((X)>(Y)?(X):(Y))int max(int x, int y){ return x > y ? x : y;}int main(){ int a 10; int b 20;int ret1 MAX(a, b);//宏会直接把定义的替换过来//((a)>(b)?(a):(b))会进行一系列的运算。此刻算完后a11.b22,ret21i…

java中transferto_被朋友问到什么是零拷贝,我一脸懵逼…

前言我们的Web应用多多少少都会处理一些静态内容&#xff0c;需要先从磁盘中读取到数据&#xff0c;在不经过修改后将此数据写入到套接字&#xff0c;伪代码如下&#xff1a;read(file, tmp_buf, len);write(socket, tmp_buf, len);虽然看似简单&#xff0c;但是它的效率却不高…

20个天才般的走心设计,真是太牛了!

全世界只有3.14 % 的人关注了爆炸吧知识科技发展一日千里&#xff0c;每天都有很多实用的小物被发明出来。下面就是20个超聪明的日常小发明&#xff0c;看过后你一定也想拥有&#xff01;“页面”椅子&#xff0c;可以帮助用户调整座椅高度&#xff0c;灵感来自于书籍装上这个以…

Android拨号盘,支持T9搜索和号码搜索

之前做通讯录软件&#xff0c;其中在做拨号盘的时候一直为怎么实现T9输入烦恼&#xff0c;上网找了很多帖子&#xff0c;都没有满意的答案。不过最后终于是实现了&#xff0c;看社区内好像也有不少朋友需要&#xff0c;在此分享一下。这个是在我项目中提取出来的拨号盘案例&…

浅谈.Net异步编程的前世今生----异步函数篇(完结)

前言上一篇我们着重讲解了TPL任务并行库&#xff0c;可以看出TPL已经很符合现代API的特性&#xff1a;简洁易用。但它的不足之处在于&#xff0c;使用者难以理解程序的实际执行顺序。为了解决这些问题&#xff0c;在C# 5.0中&#xff0c;引入了新的语言特性&#xff0c;被称为异…

NSInteger,NSUInteger,NSNumber

2019独角兽企业重金招聘Python工程师标准>>> Objective-C入门教程10:数字类型&#xff08;NSInteger,NSUInteger,NSNumber&#xff09; 柳志超博客 Program Objective-C Objective-C入门教程10:数字类型&#xff08;NSInteger,NSUInteger,NSNumber&#xff09; p…

作业优先调度java代码_如何在触发它时在java代码中为hadoop作业设置优先级?

这是我的工作人员的外表。如何在触发这项工作时设定低优先级&#xff1f;public int run(String[] args) throws Exception {this.initJob();Path outputPath new Path(args[2]);FileInputFormat.setInputPaths(job, args[0]);FileOutputFormat.setOutputPath(job, outputPath…

听说麦当劳,买一个雪糕就送一个男友!

1 麦当劳买雪糕免费送男友&#xff01;▼2 当90后成了家长......▼3 不要跟有鼻子的人握手可能刚刚扣过鼻屎▼4 鸟&#xff1a;别瞎玩&#xff01;快开车&#xff01;▼5 凭实力当上群主&#xff01;▼6 要是有喜欢的女生千万不要问她闺蜜的意见▼7 终于&#xff0c;我们…

07公务员考试公共基础知识模拟试卷1及答案--A

本试题分两部分&#xff0c;第一部分为客观试题&#xff0c;第二部分为主观试题&#xff0c;客观试题60分&#xff0c;主观试题40分&#xff0c;满分100分。考试时间180分钟。第一部分客观试题 一 单项选择题 1&#xff0e;2006年12月29&#xff0c;十届全国人大常委会二十五次…

windows server 2008更新补丁失败排错

首先描述故障故障&#xff1a;1&#xff0c;windows服务器上丢失了共享磁盘。2&#xff0c;打开服务器管理器报错3&#xff0c;更新补丁报错&#xff0c;错误代码&#xff1a;800B01004&#xff0c;手动安装.net 3.5安装包同样报错话说这次出差帮客户解决问题。遇到了这样一个错…

WPF实现统计图

WPF开发者QQ群&#xff1a; 340500857 | 微信群 -> 进入公众号主页 加入组织有小伙伴提出需要实现统计图。 由于在WPF中没有现成的统计图控件&#xff0c;所以我们自己实现一个。PS&#xff1a;有更好的方式欢迎推荐。01—代码如下一、创建 Basi…

java guava json文件_Json解析文件位置的问题

有这么一段Json{"name": "java3d:vecmath:1.3.1"},{"name": "net.sf.trove4j:trove4j:3.0.3"},{"name": "com.ibm.icu:icu4j-core-mojang:51.2"},{"name": "net.sf.jopt-simple:jopt-simple:4.5&q…

在此之前的软件系统做开发—需求的研究框架

最近的研究需要做一个软件&#xff0c;从一些方面中学习了下面的。当然&#xff0c;这些都是需求只是初步框架。也创下了基本的设计和开发&#xff0c;只是让软件公司可能对软件整体的了解需求和促进软件有一个粗略的估计。公司 实现的根本目的 现有的软件的情况下&#xff08;…

手绘图解:从零维到十维空间

全世界只有3.14 % 的人关注了爆炸吧知识事情是这样的&#xff0c;这周我给学生讲3dmax的课。为了让学生了解三视图我就顺便科普了一下什么是零维、一维、二维、三维空间。讲完不过瘾&#xff0c;感觉一支粉笔一块黑板讲维度是一件很爽的事情&#xff0c;那么.........接下来请同…

[for循环之等腰三角形]

public class IsoscelesTriangle { /*** 等腰三角形*/public void print1(){//形如 ▲向上的 for(int i1;i<5;i){for(int k1;k<5-i;k)System.out.print(" ");for(int j1;j<2*i-1;j)System.out.print("*");System.out.print("\n");}}pub…

ISA server的常见身份验证方式

ISA 2006的几种常用验证方式&#xff1a;1. 基本验证&#xff1a;此验证方式不会被加密&#xff0c;只是以明文的方式来传递信息&#xff0c;不安全。如果在“网络”的“内部”属性中将“域”选项卡里边的“选择域”来配置默认域&#xff0c;那么就会把用户送来的帐户与密码信息…

字节前端终于开源!吹爆!

Semi Design 发布&#xff0c;前端同学的福音大家好&#xff0c;我是鱼皮。最近&#xff0c;字节跳动的抖音前端技术团队开源了一款企业级应用设计系统 Semi Design 。这也是他们团队在 GitHub 上首次公开的项目&#xff0c;短短几天&#xff0c;就收获了 3.6 k 个 star。GitH…

CSS2-3常见的demo列子总结

CSS2-3常见的demo列子总结 阅读目录 1. css超过一行或者多行后显示省略号。2. css图片未知高度垂直居中完美解决方案。3. 学习使用 :before和 :after伪元素回到顶部1. css超过一行或者多行后显示省略号。 Css实现超过一行后显示省略号&#xff1b;代码如下&#xff1a;<p st…

18张难以置信的照片,封面这张你就没见过

全世界只有3.14 % 的人关注了爆炸吧知识感谢网络&#xff0c;只要点几下鼠标&#xff0c;就能看到我们以前从未见过的东西——有些甚至是难以置信的&#xff01;鲸鱼的心脏水中的鲨鱼卵幼年的箭鱼萌萌哒世界上最高的棕榈树&#xff0c;简直以为是PS的没见过的话&#xff0c;很容…