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

什么是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服务

配置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

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

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

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

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

  1. Envoy实现.NET架构的网关(五)集成Redis实现限流

    .NET网关与Gateway实战-Envoy与kong课程 什么是限流 限流即限制并发量,限制某一段时间只有指定数量的请求进入后台服务器,遇到流量高峰期或者流量突增时,把流量速率限制在系统所能接受的合 ...

  2. Envoy实现.NET架构的网关(三)代理GRPC

    .NET网关与Gateway实战-Envoy与kong课程 Envoy实现.NET架构的网关(一)静态配置与文件动态配置 Envoy实现.NET架构的网关(二)基于控制平面的动态配置 什么是GRPC ...

  3. Envoy实现.NET架构的网关(一)静态配置与文件动态配置

    什么是Gateway 在微服务体系结构中,如果每个微服务通常都会公开一组精细终结点,这种情况可能会有以下问题 如果没有 API 网关模式,客户端应用将与内部微服务相耦合. 在客户端应用中,单个页面/屏 ...

  4. Janus网关的集成与优化

    本文由学霸君音视频架构师李桥平在LiveVideoStackCon 2020 线上峰会的演讲内容整理而成,内容主要包括Janus网关的集成过程以及集成过程中遇到的一些问题. 文 / 李桥平 整理 / ...

  5. 电子电气架构车载网关系列——常见网关芯片特点

    电子电气架构车载网关系列--常见网关芯片特点 我是穿拖鞋的汉子,魔都中一位工程师! 老规矩分享一段喜欢的文字,避免成为高知识低文化的工程师! 见的人多了,自己得承认,那些身上自带稳定与秩序感得人是最吸 ...

  6. [译] 编写AndroidStudio插件(四):集成Jira

    原文:Write an Android Studio Plugin Part 4: Jira Integration 作者:Marcos Holgado 译者:却把清梅嗅 <编写AndroidS ...

  7. 云效平台:企业级互联网架构下的持续集成与持续交付实践

    摘要:本文的整理自2017云栖大会-南京峰会上阿里云高级技术专家鲁小川的分享讲义,讲义主要分享了阿里云云效平台对于企业级互联网架构下的持续集成与持续交付的实践经验,首先介绍了阿里云云效平台的起源,之后 ...

  8. 走向.NET架构设计—第四章—业务层分层架构(后篇)

    走向.NET架构设计-第四章-业务层分层架构(后篇) 前言: 在上一篇文章中,我们讨论了组织业务逻辑的模式:Transaction Script和Active Record,Domain Model. ...

  9. 走向.NET架构设计—第四章—业务层分层架构(前篇)

    走向.NET架构设计-第四章-业务层分层架构(前篇) 前言:在任何一个项目中业务层毫无疑问是最重要的层,所以在设计的过程中,如何组织业务层是至关重要的.本章的讨论将会涉及Flower的架构模式一书中的 ...

最新文章

  1. 女生参加web前端培训可以吗
  2. 7 Papers Radios | NeurIPS 2020最佳论文;全卷积网络实现E2E目标检测
  3. AI产品之路:神经元与神经网络
  4. WDS部署服务之四镜像捕获(1)
  5. C#获取键盘和鼠标操作的时间的类
  6. 平凡的世界,有感而发
  7. 您试图从目录中执行CGI、ISAPI 或其他可执行程序,但该目录不允许执行程序
  8. hdu 1269(Tarjan求强连通分量)
  9. Material Design学习之 Snackbars(详细分析,Toast的加强版)
  10. 后端技术:阿里开源的接口限流神器Sentinel介绍
  11. 教你如何在Android 6.0上创建系统悬浮窗
  12. 原生JS实现的DOM操作笔记(草稿整理)
  13. java 递归_两篇文章带你了解java基础算法之递归和折半查找
  14. CCF201712-3 Crontab(100分)【模拟+文本处理】
  15. iOS基础 - UIScrollView
  16. excel 直接查询企查查数据_EXCEL在多表中查询数据(函数中引用工作表的办法)...
  17. Python 字符串去除空格的方法
  18. java 读取Excel(.xls格式)
  19. 群发邮件服务器软件,邮件服务器软件:邮件群发是否已死?
  20. 《『EcmaScript』之理顺Js中的四种继承

热门文章

  1. JavaScript数组sort方法(数组排序)
  2. sqlite3源码编译到Android,实现SQLite跨全平台使用
  3. php ip2long 32 64位,詳談php ip2long 出現負數的原因及解決方法
  4. 使用maven构建项目候,jar包错误的解决办法
  5. Java的接口、继承与多态
  6. springboot小笔记
  7. html之file标签 --- 图片上传前预览 -- FileReader
  8. net MVC 重定向总结
  9. SQL:认识数据库约束
  10. Effective C# 原则35:选择重写函数而不是使用事件句柄(译)