Ocelot简易教程(五)之集成IdentityServer认证以及授权

2023-05-16

Ocelot简易教程目录

  1. Ocelot简易教程(一)之Ocelot是什么
  2. Ocelot简易教程(二)之快速开始1
  3. Ocelot简易教程(二)之快速开始2
  4. Ocelot简易教程(三)之主要特性及路由详解
  5. Ocelot简易教程(四)之请求聚合以及服务发现
  6. Ocelot简易教程(五)之集成IdentityServer认证以及授权

    作者:依乐祝
    原文地址:https://www.cnblogs.com/yilezhu/p/9807125.html

最近比较懒,所以隔了N天才来继续更新第五篇Ocelot简易教程,本篇教程会先简单介绍下官方文档记录的内容然后在前几篇文档代码的基础上进行实例的演示。目的是为了让小白也能按照步骤把代码跑起来。当然,在开始之前你要对IdentityServer有一定的了解,并且能够进行IdentityServer的集成,如果你还不会集成IdentityServer的话还是先看看我的这篇Asp.NetCoreWebApi图片上传接口(二)集成IdentityServer4授权访问(附源码)文章吧。里面有一步一步的集成IdentityServer的实例。

好了,废话说完了,那就让我们开始进入今天的主题吧!Ocelot认证与授权。

概念表述

认证

为了验证ReRoutes并随后使用Ocelot的任何基于声明的功能,例如授权或使用令牌中的值修改请求。 用户必须像往常一样在他们的Startup.cs中注册认证服务,惟一的不同是他们需要给每个认证注册提供一个方案,例如

public void ConfigureServices(IServiceCollection services)
{
    var authenticationProviderKey = "OcelotKey";

    services.AddAuthentication()
        .AddJwtBearer(authenticationProviderKey, x =>
        {
        });
}

在此示例中,OcelotKey是此提供程序已注册的方案。然后我们将其映射到配置中的ReRoute,例如

"ReRoutes": [
    {
      "DownstreamPathTemplate": "/api/{everything}",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 1001
        },
        {
          "Host": "localhost",
          "Port": 1002
        }
      ],
      "UpstreamPathTemplate": "/{everything}",
      "UpstreamHttpMethod": [ "Get", "Post" ],
      "LoadBalancerOptions": {
        "Type": "RoundRobin"
      },
      "AuthenticationOptions": {
        "AuthenticationProviderKey": "OcelotKey",
        "AllowedScopes": []
      }
    }
  ]

当Ocelot运行时,它将查看此ReRoutes中 AuthenticationOptions节点下面的AuthenticationProviderKey并检查是否有使用给定密钥注册的身份验证提供程序。如果没有,那么Ocelot不会启动,如果有的话ReRoute将在执行时使用该提供者。

如果对ReRoute进行了身份验证,则Ocelot将在执行身份验证中间件时调用与其关联的认证方案。如果请求失败,则认证Ocelot返回http的状态代码为401即未授权状态。

JWT令牌

如果您想使用JWT令牌进行身份验证,可能来自OAuth之类的提供程序,您可以正常注册您的身份验证中间件,例如

public void ConfigureServices(IServiceCollection services)
{
    var authenticationProviderKey = "OcelotKey";

    services.AddAuthentication()
        .AddJwtBearer(authenticationProviderKey, x =>
        {
            x.Authority = "test";
            x.Audience = "test";
        });

    services.AddOcelot();
}

然后将身份验证提供程序密钥映射到配置中的ReRoute,例如

"ReRoutes": [
    {
      "DownstreamPathTemplate": "/api/{everything}",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 1001
        },
        {
          "Host": "localhost",
          "Port": 1002
        }
      ],
      "UpstreamPathTemplate": "/{everything}",
      "UpstreamHttpMethod": [ "Get", "Post" ],
      "LoadBalancerOptions": {
        "Type": "RoundRobin"
      },
      "AuthenticationOptions": {
        "AuthenticationProviderKey": "OcelotKey",
        "AllowedScopes": []
      }
    }
  ]

Identity Server Bearer Tokens认证

接下来上今天的主角了。identityServer认证方式。为了使用IdentityServer承载令牌,请按照惯例在ConfigureServices 中使用方案(密钥)注册您的IdentityServer服务。 如果您不明白如何操作,请访问IdentityServer文档。或者查看我的这篇Asp.NetCoreWebApi图片上传接口(二)集成IdentityServer4授权访问(附源码)文章。

 var authenticationProviderKey = "OcelotKey";
            var identityServerOptions = new IdentityServerOptions();
            Configuration.Bind("IdentityServerOptions", identityServerOptions);
            services.AddAuthentication(identityServerOptions.IdentityScheme)
                .AddIdentityServerAuthentication(authenticationProviderKey, options =>
                {
                    options.RequireHttpsMetadata = false; //是否启用https
                    options.Authority = $"http://{identityServerOptions.ServerIP}:{identityServerOptions.ServerPort}";//配置授权认证的地址
                    options.ApiName = identityServerOptions.ResourceName; //资源名称,跟认证服务中注册的资源列表名称中的apiResource一致
                    options.SupportedTokens = SupportedTokens.Both;
                }
                );
            services.AddOcelot()//注入Ocelot服务
                    .AddConsul();

然后将身份验证提供程序密钥映射到配置中的ReRoute,例如

"ReRoutes": [
    {
      "DownstreamPathTemplate": "/api/{everything}",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 1001
        },
        {
          "Host": "localhost",
          "Port": 1002
        }
      ],
      "UpstreamPathTemplate": "/{everything}",
      "UpstreamHttpMethod": [ "Get", "Post" ],
      "LoadBalancerOptions": {
        "Type": "RoundRobin"
      },
      "AuthenticationOptions": {
        "AuthenticationProviderKey": "OcelotKey",
        "AllowedScopes": []
      }
    }
  ]

允许访问的范围(Allowed Scopes)

如果将范围添加到AllowedScopes,Ocelot将获得类型范围的所有用户声明(从令牌中),并确保用户具有列表中的所有范围。

这是一种基于范围限制对ReRoute访问的方式。(我也没用过这种方式,感觉有点类似IdentityServer Scope的概念)

实例演示集成IdentityServer

  1. 新建一个OcelotDemo.Auth asp.net core web api项目

  2. 项目进行IdentityServer服务端相关的配置,这里为了演示的方便采用硬编码的方式进行的配置。具体配置可以参考Asp.NetCoreWebApi图片上传接口(二)集成IdentityServer4授权访问(附源码)这篇文章

  3. 在网关项目OcelotDemo中添加Nuget包

    Install-Package IdentityServer4.AccessTokenValidation   
  4. 在OcelotDemo项目中的Startup.cs中加入identityServer验证,如下所示:

    var authenticationProviderKey = "OcelotKey";
                var identityServerOptions = new IdentityServerOptions();
                Configuration.Bind("IdentityServerOptions", identityServerOptions);
                services.AddAuthentication(identityServerOptions.IdentityScheme)
                    .AddIdentityServerAuthentication(authenticationProviderKey, options =>
                    {
                        options.RequireHttpsMetadata = false; //是否启用https
                        options.Authority = $"http://{identityServerOptions.ServerIP}:{identityServerOptions.ServerPort}";//配置授权认证的地址
                        options.ApiName = identityServerOptions.ResourceName; //资源名称,跟认证服务中注册的资源列表名称中的apiResource一致
                        options.SupportedTokens = SupportedTokens.Both;
                    }
                    );
                services.AddOcelot()//注入Ocelot服务
                        .AddConsul();
  5. 在ocelot.json中需要加入验证的ReRoute中,修改为如下的配置代码:

    "ReRoutes": [
        {
          "DownstreamPathTemplate": "/api/{everything}",
          "DownstreamScheme": "http",
          "DownstreamHostAndPorts": [
            {
              "Host": "localhost",
              "Port": 1001
            },
            {
              "Host": "localhost",
              "Port": 1002
            }
          ],
          "UpstreamPathTemplate": "/{everything}",
          "UpstreamHttpMethod": [ "Get", "Post" ],
          "LoadBalancerOptions": {
            "Type": "RoundRobin"
          },
          "AuthenticationOptions": {
            "AuthenticationProviderKey": "OcelotKey",
            "AllowedScopes": []
          }
        }
      ]
  6. 打开PostMan测试一下代码吧,首先访问一下http://localhost:1000/values 这时候返回的结果是401未授权的状态,如下图所示:

    1539780575952

  7. 然后访问我们上面新建的IdentityServer服务器并获取Token。如下图所示配置对应的参数进行获取:

    1539780272769

  8. 然后使用我们获取到的access_token进行Ocelot网关接口的访问,如下所示进行配置:

    1539780805247

    可以看到结果返回了200代码,并且结果在Good以及Order之间进行切换。因为Ocelot.json文件中对路由进行了RoundRobin的负载均衡的策略。

授权

Ocelot支持基于声明的授权,该授权在身份验证后运行。这意味着如果您有要授权的Url,则可以将以下内容添加到ReRoute配置中。

"RouteClaimsRequirement": {
    "UserType": "registered"
}

在此示例中,当调用授权中间件时,Ocelot将检查用户是否具有声明类型UserType以及是否已注册该声明的值。如果不是,则用户将不被授权,并且将响应403禁止访问的状态码。

当然这种授权的方式在大部分业务场景中都是不适用的,需要自己重写Ocelot的中间件才能实现。通过Ocelot中间件的重写你可以实现自己的授权逻辑,如果你还有限流的需求,比如说对每个客户端进行不同的限流策略。比方说,有三个客户端A,B,C。访问相同的URL,但是我们要控制A,每分钟只能访问10次,B每分钟能访问20次,而C不允许访问。针对这个场景Ocelot却没有相关的实现。但是我们可以通过重写Ocelot中间件来实现它。由于篇幅有限,所以今天就不进行介绍了。但是我会抽时间进行相关的实现,并分享给大家。

源码

本篇博文的源码已经上传到Github。可以进行参考。https://github.com/yilezhu/OcelotDemo

总结

本文先大致介绍一下Ocelot如何集成认证授权,然后通过实例进行了IdentityServer集成的演示,希望能对大家有一定的参考作用。当然文中也提到了,应对复杂的授权以及限流需要自行重写Ocelot中间件进行实现。具体如何实现呢,我会尽快分享给大家。同样的通过重写Ocelot中间件我们还可以把ocelot.json的配置信息存储到数据库并缓存到Redis中!最后,感谢大家的阅读!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ocelot简易教程(五)之集成IdentityServer认证以及授权 的相关文章

  • JSON传list数据到springMVC后台并用对象接收

    在项目中经常获取前台table中的数据 然后拼接传向后台 之前一直按照JSON格式拼接 但是非常容易出问题 而且遇到了类似List lt beans gt list 这样的参数 springMVC转化为对象会报错 正确的做法是按下面这种做法
  • Java解析网络数(Json)运用CloseableHttpClient

    最近做用Java网络爬取数据的部分 xff0c 发现在使用Apache的httpclient的时候 xff0c 发现Idea提示DefaultHttpClient等常用的类已经不推荐使用了 现在运用 CloseableHttpClient
  • 【Linux】Ubuntu18.0.4安装wine 失败遇到的问题和解决的思路 尝试覆盖共享/usr/share/doc/ 处理时有错误 /tmp/apt-dpkg-install-6NvbtI/

    bug说明 xff1a dpkg 处理归档 var cache apt archives libattr1 1 2 4 47 2 amd64 deb unpack 时出错 xff1a 尝试覆盖共享的 usr share doc libatt
  • 算法模型---时间序列模型

    文章来源 时间序列 时间序列是时间间隔不变的情况下收集的不同时间点数据集合 xff0c 这些集合被分析用来了解长期发展趋势及为了预测未来 时间序列与常见的回归问题的不同点在于 1 时间序列是跟时间有关的 而线性回归模型的假设 xff1a 观
  • java: 找不到符号 符号: 类 BASE64Encoder 位置: 程序包 sun.misc

    1 问题 新项目编译报错如下 xff1a java 找不到符号 符号 类 BASE64Encoder 位置 程序包 sun misc 2 解决方案 依图如下 xff0c 修改jdk对应的版本即可
  • tar 打包隐藏文件

    前言 xff1a 先说一下遇到的场景 xff1a 前段时间在配合做 DevOps xff0c 组内有块代码是 php 的 xff0c 需要用 tar 命令打包归档上传到 nexus 库 xff0c 后来发现解压出来的包居然缺失了隐藏文件 x
  • The server selected protocol version TLS10 is not accepted by client preferences [TLS12] 报错处理

    一 问题描述 xff1a 项目工程需求要连接 SqlServer 服务器 xff0c 但是报错了 xff0c 完整错误如下 xff1a com microsoft sqlserver jdbc SQLServerException 驱动程序
  • 23种设计模式

    目录 创建型 1 Factory Method xff08 工厂方法 xff09 2 Abstract Factory xff08 抽象工厂 xff09 3 Builder xff08 建造者 xff09 4 Prototype xff08
  • SpringBoot开启异步多线程

    前言 xff1a SpringBoot 的异步多线程需要从 java 的多线程基础说起 xff0c 可以参考 java 多线程实现的三种方式区别 SpringBoot 在此基础上进行了多次封装 xff0c 所以使用起来非常方便 一 核心参数
  • 制作 java-sdk 的两种方式

    前言 xff1a 平时maven工程里 pom 中的引用的依赖就是别人开发好的 sdk 包 xff1b 工作中为了方便一些开发也需要自定义开发 sdk 包 xff0c 下面介绍下怎么开发 一 两种方式 我们平时引用 sdk 有两种方式 xf
  • SpringBoot 之 AOP

    前言 xff1a Spring 三大核心思想是啥 xff0c 还记得不 xff1f IOC xff08 控制反转 xff09 xff0c DI xff08 依赖注入 xff09 xff0c AOP xff08 面向切面编程 xff09 回顾
  • mongodb 的常用数据操作

    摘要 xff1a 主要记录一些常见 的mongodb 的增删改查 xff0c 方便以后查阅 1 增 基本格式 xff1a db test doc insert 或 db test doc save 样例 xff1a db test doc
  • Python键盘输入转换为列表

    Python输入字符串转列表是为了方便后续处理 xff0c 这种操作在考试的时候比较多见 1 在Python3 0以后 xff0c 键盘输入使用input函数 eg1 span class hljs prompt gt gt gt span
  • java.lang.NoSuchMethodError 原因和处理方案

    问题描述 工程中明明有该方法 xff0c 却提示 java lang NoSuchMethodError 错误 1 原因 java 的类加载机制是把所有不同名称的本类和引用类的包全部加载到内存 xff0c 这样就有一个问题 xff0c 如果
  • java:try...catch跳过异常继续处理循环

    问题描述 在代码循环体中 xff0c 抛出异常后代码会停止执行 xff0c 导致代码不能完整运行 解决方案很简单 xff0c 捕获异常并简单处理一下就可以 1 捕获异常继续执行代码 只贴核心样例代码 public void getTest
  • python去掉空格常用方式

    前言 xff1a 处理字符串时经常要定制化去掉无用的空格 xff0c python 中要么用存在的常规方法 xff0c 或者用正则处理 1 去掉左边空格 string 61 34 it is blank space test 34 prin
  • 20190226-LCD_GUI

    LCD GUI 这里需要先剃度填色 xff0c 然后再显示汉字 xff0c 最后在显示符号和数字 xff0c 否则会被覆盖 xff0c 显示不出来汉字或者数字符号
  • Arch安装

    从2021年4月起 xff0c Arch Linux安装镜像中已经包含了一个官方的简易安装程序archinstall 可以支持在连接网络后进行英文交互式安装 Arch Linux News Installation medium with
  • 存储过程懂不懂

    存储过程的官方定义是这么说的 xff1a 存储过程 xff08 Stored Procedure xff09 是一组为了完成特定功能的 SQL 语句集 xff0c 经编译后存储在数据库中 用户通过指定存储过程的名字并给出参数 xff08 如
  • ArchLinux的用户配置和KDE安装

    用户配置 建立用户 目标是新建一个普通用户 xff0c 这个普通用户可以使用sudo提权 以下默认使用username作为用户名 建立无密码用户并创立其默认用户组 useradd username 更改账户密码 passwd usernam

随机推荐

  • Zsh的简单配置

    Zsh 简体中文 ArchWiki archlinux org 本配置的目标是增加一些简单的功能以及一个能过得去的界面 安装 安装zsh xff08 本体 xff09 和zsh completions xff08 补全 xff09 两个包
  • Arch(KDE Plasma)中文化

    Localization 简体中文 Simplified Chinese 简体中文 ArchWiki 生成中文locale xff08 这一步在安装篇就有写 xff09 在 etc locale gen中取消中文的zh CN UTF 8 U
  • yay的安装与使用与Anbox的安装

    yay的安装 安装 首先安装所需软件包base devel和git pacman Syu base devel git 之后使用git clone下载代码 git clone URL FORM AUR 这里的 URL FROM AUR 指从
  • linux下利用C语言实现对文件的操作(创建、复制、修改权限、修改文件名)

    今天在ubuntu下编写一个了C程序实现如下功能 xff1a xff08 1 xff09 创建一个文本文件 xff0c 写入 Hello World xff01 xff08 2 xff09 获取该文件的所有权限 xff08 3 xff09
  • 设计模式案例分析与实现

    1 UML类图及Java实现 案例 xff1a 某基于C S的即时聊天系统登录模块功能描述如下 xff1a 用户通过登录界面 LoginForm 输入账号和密码 xff0c 系统将输入的账号和密码与存储在数据库 User 表中的用户信息进行
  • 决策树算法

    目录 1 概述 1 1 算法导入 1 2 决策树定义 1 3 决策树发展 1 4 结构 1 5 从树到规则 2 决策树的构建 2 1 基本原理 2 2 特征选择 2 3 实例分析 ID3 2 4 增益率 C4 5算法 2 5 基尼指数 CA
  • 机器学习——图像分类

    1 图像分类的概念 1 1 什么是图像分类 xff1f 图像分类 xff0c 根据图像信息中所反映出来的不同特征 xff0c 把不同类别的目标区分开来的图像处理方法 1 2 图像分类的难度 任何拍摄情 况的改变都将提升分类的难度 1 3 C
  • 日常开发报错记录

    20230424 python3 7中报错 xff1a No module named typing extensions 在网上找到的解决办法 xff1a pytorch 错误 xff1a No module named typing e
  • 基于C++的通讯管理系统

    1 系统需求 通讯录是一个可以记录亲人 好友信息的工具 本教程主要利用C 43 43 来实现 个通讯录管理系统 系统中需要实现的功能如下 添加联系人 向通讯录中添加新人 xff0c 信息包括 姓名 性别 年龄 联系电话 家庭住址 最多记录1
  • 存储过程进阶(vb.net+SQL Server2008环境)

    写过一篇 存储过程入门 的博客 xff0c 那仅仅是入门 xff0c 下面和大家一起深入学习存储过程 xff08 也许以后还会有更深入 xff09 以经典的注册为例子 xff0c 篇幅有限只写了核心部分 xff0c 其他略过 无参数无返回值
  • 基于C++的职工管理系统

    1 管理系统需求 职工管理系统可以用来管理公司内所有员工的信息 本教程主要利用C 来实现一个基于多态的职工管理系统 公司中职工分为三类 普通员工 经理 老板 显示信息时 需要显示职工编号 职工姓名 职工岗位 以及职责 普通员工职责 完成经理
  • C++提高编程

    本阶段主要针对C 43 43 泛型编程和STL技术做详细讲解 xff0c 探讨C 43 43 更深层的使用 1模板 1 1模板的概念 模板就是建立通用的模具 xff0c 大大提高复用性 例如生活中的模板 一寸照片模板 1 2函数模板 C 4
  • 在卸载东西时,一不小心把window资源管理器给结束,电脑黑屏了。

    今天在卸载东西时 xff0c 有个卸载的残旧文件删除不了 xff0c 显示资源管理器正在使用 xff0c 然后我二话不说直接杀进程去了 xff0c 一不小心将资源管理器的进程给就地正法 xff0c 删完之后电脑直接黑屏 话不多说 xff0c
  • 什么是 JDK?

    JDK 是 Java Development ToolKit 的简称 xff0c 也就是 Java 开发工具包 JDK 是整个 Java 的核心 xff0c 包括 Java 运行环境 xff08 Java Runtime Envirnmen
  • 对《Java编程思想》读者的一点建议

    Java 编程思想 这本书在豆瓣的评分高达 9 1 分 xff0c 但我总觉得有点虚高 记得刚上大学那会 xff0c 就在某宝上买了一本影印版的 Java 编程思想 xff0c 但由于初学 Java xff0c 对编程极度缺乏信心 xff0
  • Caused by: java.lang.NumberFormatException: For input string: "performance-now.js"

    DEBUG 2019 01 08 10 43 53 507 org springframework web servlet DispatcherServlet Handler execution resulted in exception
  • spring mvc执行过程

    springMVC执行的过程 流程如下 xff1a 用户发起请求到前端控制器 xff08 DispatcherServlet xff09 xff0c 该控制器会过滤出哪些请求可以访问Servlet 哪些不能访问 就是url pattern的
  • 如何解决电脑无法访问个别网站

    今天重装系统后 xff0c 将所有的系统软件都安装了最新的版本 xff0c 在上网的过程中 xff0c 发现了一个奇怪的问题 xff0c 电脑可以访问网络 xff0c 但却有很多国内的网站都访问不了 xff0c 换了不同的浏览器测试也是同样
  • Springmvc基础

    springmvc入门 springmvc概述 controller层的框架 xff0c 代替Servlet xff0c 处理请求和响应 springmvc快速入门 64 Controller xff1a 将Bean交给Spring管理 x
  • Ocelot简易教程(五)之集成IdentityServer认证以及授权

    Ocelot简易教程目录 Ocelot简易教程 xff08 一 xff09 之Ocelot是什么Ocelot简易教程 xff08 二 xff09 之快速开始1Ocelot简易教程 xff08 二 xff09 之快速开始2Ocelot简易教程