.Net Core使用Ocelot网关(二) -鉴权认证

前言

上一章.Net Core使用Ocelot网关(一) -负载,限流,熔断,Header转换 已经简单的介绍了ocelot的使用了,但是网关暴露的接口如果什么人都能访问的话安全性就太低啦。所以我们需要去鉴权和认证。这里我们使用identityServer4给我们的网关来鉴权认证。

创建Identity服务

我们创建一个identity的服务来用于令牌的发放和鉴权。下图是我的项目结构。

Api_Gatewat端口:5000
Api_A端口:5001
Api_B端口:5002
IdentityServer端口:5003

通过nuget添加IdentityServer4的包,也可以通过程序包管理控制台执行以下命令Install-Package IdentityServer4

添加一个Congif文件。

using System.Collections.Generic;
using IdentityModel;
using IdentityServer4;
using IdentityServer4.Models;namespace IdentityServer
{public static class Config{public static IEnumerable<IdentityResource> GetIdentityResourceResources(){return new List<IdentityResource>{new IdentityResources.OpenId(), //必须要添加,否则报无效的scope错误};}// scopes define the API resources in your systempublic static IEnumerable<ApiResource> GetApiResources(){//可访问的API资源(资源名,资源描述)return new List<ApiResource>{new ApiResource("Api_A", "Api_A"),new ApiResource("Api_B", "Api_B")};}public static IEnumerable<Client> GetClients(){return new List<Client>{new Client{ClientId = "client_a", //访问客户端Id,必须唯一//使用客户端授权模式,客户端只需要clientid和secrets就可以访问对应的api资源。AllowedGrantTypes = GrantTypes.ClientCredentials,ClientSecrets ={new Secret("secret".Sha256())},AllowedScopes = { "Api_A",IdentityServerConstants.StandardScopes.OpenId,IdentityServerConstants.StandardScopes.Profile }},new  Client{ClientId = "client_b",ClientSecrets = new [] { new Secret("secret".Sha256()) },AllowedGrantTypes = GrantTypes.ClientCredentials,AllowedScopes = { "Api_B",IdentityServerConstants.StandardScopes.OpenId,IdentityServerConstants.StandardScopes.Profile }}};}}
}

添加两个API资源,并且添加两个客户端分别去访问不同资源。

在 Startup 中的 ConfigureServices 中配置IdentityServer服务。

public void ConfigureServices(IServiceCollection services)
{services.AddIdentityServer().AddDeveloperSigningCredential().AddInMemoryApiResources(Config.GetApiResources()).AddInMemoryClients(Config.GetClients());
}

在 Configure 中把IdentityServer放入http管道中。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseIdentityServer();
}

为ocelot集成Identity

通过nuget添加IdentityServer4.AccessTokenValidation的包,也可以通过程序包管理控制台执行以下命令 Install-Package IdentityServer4.AccessTokenValidation

IdentityServer4.AccessTokenValidation - 用于验证IdentityServer4中的JWT和引用令牌

在 Startup 的 ConfigureServices 中分别注册两个认证方案 Configure 中配置IdentityServer服务。

public void ConfigureServices(IServiceCollection services)
{services.AddAuthentication().AddJwtBearer("Api_A", i =>{i.Audience = "Api_A";i.Authority = "http://localhost:5003";i.RequireHttpsMetadata = false;}).AddJwtBearer("Api_B", y =>{y.Audience = "Api_B";y.Authority = "http://localhost:5003";y.RequireHttpsMetadata = false;});services.AddOcelot(new ConfigurationBuilder().AddJsonFile("configuration.json").Build());
}public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseOcelot();app.UseAuthorization();
}

并修改ocelot配置文件,在Routes中添加授权信息

{"ReRoutes": [{"UpstreamPathTemplate": "/Api_A/{controller}/{action}","DownstreamPathTemplate": "/api/{controller}/{action}","UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ],"DownstreamScheme": "http","DownstreamHostAndPorts": [{"Host": "localhost","Port": 5001}],"RateLimitOptions": {"ClientWhitelist": [ "127.0.0.1" ],"EnableRateLimiting": true,"Period": "1m","PeriodTimespan": 30,"Limit": 5},"FileCacheOptions": {"TtlSeconds": 5,"Region": "time"},"UpstreamHeaderTransform": {"demo": "a,b"},"DownstreamHeaderTransform": {"demo": "xxxxxxx","Location": "{DownstreamBaseUrl},{BaseUrl}"},//授权信息"AuthenticationOptions": {"AuthenticationProviderKey": "Api_A","AllowedScopes": []}},{"UpstreamPathTemplate": "/Api_B/{controller}/{action}","DownstreamPathTemplate": "/api/{controller}/{action}","UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ],"DownstreamScheme": "http","DownstreamHostAndPorts": [{"Host": "localhost","Port": 5002}],//授权信息"AuthenticationOptions": {"AuthenticationProviderKey": "Api_B","AllowedScopes": []}}],"QoSOptions": {"ExceptionsAllowedBeforeBreaking": 3,"DurationOfBreak": 20,"TimeoutValue": 5000},"GlobalConfiguration": {"RateLimitOptions": {"DisableRateLimitHeaders": false,"QuotaExceededMessage": "接口限流!","HttpStatusCode": 200,"ClientIdHeader": "ClientId"}}
}

Ocelot会去检查ReRoutes是否配置了AuthenticationOptions节点。如果有会根据配置的认证方案进行身份认证。如果没有则不进行身份认证。
AuthenticationProviderKey 是刚才注册的认证方案。
AllowedScopes 是 AllowedScopes中配置的授权访问范围。

演示效果

我们为api_a和api_b分别注册了认证方案。如果我们不申请token是会401没有权限访问。

我们通过identityServer申请一个的token,并用它访问api_a和api_b。



可以看到我们申请的token是可以访问api_a的,但是不能访问api_b,因为client_a这个客户端只有访问api_a的权利。如果想访问api_b使用client_b申请token就可以啦。

总结

简单为Ocelot集成了IdentityServer,希望对大家有参考价值。如果文中有错误请联系我更改。

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

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

相关文章

蓝桥杯 k倍区间 前缀和

参考代码&#xff1a; #include<bits/stdc.h> using namespace std; typedef long long ll; int array[100005], t[100005]; //array记录每个元素值&#xff0c;t记录取余k&#xff0c;各余数对应前缀和的数量 int main() {ios::sync_with_stdio(false); ll sum 0, c…

Kubernetes 的2020年“野望”

Kubernetes是一个用于部署容器化应用程序的开源容器编排系统&#xff0c;由Alphabet的GOOGL Google部门设计&#xff0c;其发展势头强劲&#xff0c;这得益于全球企业以指数级的速度生成数据之大势。Kubernetes支持在单个OS上无缝部署多个应用程序并实现诸如监视、调度、扩展这…

蓝桥杯 作物杂交 DFS搜索

参考代码&#xff1a; #include<bits/stdc.h> #define INF 0x3f3f3f3f using namespace std; typedef long long ll; int cost[2005]; //记录每个作物杂交所需要的时间 int dis[2005]; //记录每个作物到t点的最短时间 struct node{ //结构体存储每种杂交方案 int a…

微服务的时间和成本去哪儿了

2019 中国.NET 开发者峰会目前在国内的.NET社区还是很有影响力的&#xff0c;宣传的内容也都是比较新潮和前言的技术栈。有一个不争的现实是基本上主题都是关于.NET Core的&#xff0c;以及基于该主题之上的延展。比如ML.NET相关的机器学习&#xff1b;基于.NET Core的微服务实…

Leetcode 1109.航班预定统计 差分

思路&#xff1a; 这道题假如要用暴力的方法&#xff0c;是过不去的。要使用差分的思想&#xff0c;创建一个差数组。因为本道题初始的座位数是0&#xff0c;直接建立一个全0数组即可。 参考代码&#xff1a; class Solution { public:vector<int> corpFlightBookings(…

自定义滚动条(Custom ScrollBar)

时间如流水&#xff0c;只能流去不流回&#xff01; 点赞再看&#xff0c;养成习惯&#xff0c;这是您给我创作的动力&#xff01; 本文 Dotnet9 https://dotnet9.com 已收录&#xff0c;站长乐于分享dotnet相关技术&#xff0c;比如Winform、WPF、ASP.NET Core等&#xff0c;亦…

Leetcode 1094.拼车 差分

思路&#xff1a; 这道题有很多种解法&#xff0c;刚好最近在学差分&#xff0c;就用差分做吧。首先是初始没有乘客&#xff0c;差分diff数组各项为0&#xff0c;不用求差构造差分数组了。接着是每一次乘车方案&#xff0c;起点站需要加上乘客数&#xff0c;终点站需要减去乘客…

用ASP.NET Core构建可检测的高可用服务--学习笔记

摘要随着现代化微服务架构的发展&#xff0c;系统故障的定位与快速恢复面临着诸多挑战&#xff0c;构建可检测的服务&#xff0c;帮助线上保障团队时刻掌控应用的运行状况越来越重要。本次分享会讲解如何让 ASP .NET Core 应用与现代化云基础设施完美融合&#xff0c;提升服务的…

Leetcode 34.在排序数组中查找元素的第一个和最后一个位置 二分

第一种方法&#xff0c;比较简单&#xff0c;左边界查找使用C的upper_bound()函数&#xff0c;右边界从左边界开始往下查找。 参考代码&#xff1a; class Solution { public:vector<int> searchRange(vector<int>& nums, int target) {vector<int> re…

[功能发布]Excel催化剂2周年巨献-网页数据采集功能发布,满足90%合理场景使用...

转眼间&#xff0c;Excel催化剂推出已经两周年&#xff0c;在此之际&#xff0c;献上数据时代最刚需的网页采集功能&#xff0c;无需苦苦寻觅各种工具&#xff0c;借助Excel催化剂过往数据处理、清洗功能&#xff0c;加上此轮的网页采集功能&#xff0c;一点不输于市面上的各种…

Leetcode 35.搜索插入位置 二分

题目链接 思路&#xff1a; 是常规的二分法&#xff0c; 需要注意的是&#xff0c;当数字不存在的时候&#xff0c;需要返回插入该数进序列并保持有序的位置&#xff0c;即返回的是最后一个小于查找数target的位置。二分查找最后结束的位置&#xff0c;即退出循环时的左边界或…

.NET Core 微服务学习与实践系列文章目录索引(2019版)

Photo &#xff1a;.NET Core文 | Edison Zhou2018年&#xff0c;我开始学习和实践.NET Core&#xff0c;并开始了微服务的学习&#xff0c;以及通过各种开源组件搭建服务治理技术方案&#xff0c;并在学习过程中总结了一个.NET Core微服务学习与实践系列文章&#xff0c;涵盖了…

蓝桥杯 子串分值 递推

思路&#xff1a; 本题有点难想&#xff0c;采用贡献和的思想。首先需要定义一个last数组&#xff0c;用于记录当前遍历的字母s[i]上一次出现在字符串s中的位置。接着遍历数组&#xff0c;计算每一个字母的贡献值。 参考代码&#xff1a; #include<bits/stdc.h> #defi…

dapr微服务.net sdk入门

Actors入门先决条件.Net Core SDK 3.0Dapr CLIDapr DotNet SDK概述本文档描述如何在客户端应用程序上创建Actor&#xff08;MyActor&#xff09;并调用其方法.MyActor --- MyActor.Interfaces|- MyActorService|- MyActorClient接口项目&#xff08;\MyActor\MyActor.Interface…

TPL Dataflow组件应对高并发,低延迟要求

长话短说2C互联网业务增长&#xff0c;单机多核的共享内存模式带来的排障问题、编程困难&#xff1b;随着多核时代和分布式系统的到来&#xff0c;共享模型已经不太适合并发编程&#xff0c;因此actor-based模型又重新受到了人们的重视。---------------------------调试过多线…

蓝桥杯 递增三元组 二分

参考代码&#xff1a; #include<bits/stdc.h> #define INF 0x3f3f3f3f using namespace std; typedef long long ll; ll cnt 0; int a[100005], b[100005], c[100005];int main() {ios::sync_with_stdio(false); int n;cin >> n;for(int i 0; i < n; i)cin…

蓝桥杯 人物相关性分析 二分

思路&#xff1a; 这道题是常规的模拟题&#xff0c;根据题意写出相关代码即可。模拟题一般容易在边界条件上出错&#xff0c;建议自己设计几个样例测试一下。这题纯暴力的方法不能通过所有的测试点&#xff0c;对于最后的查询&#xff0c;应该使用二分查找&#xff0c;这样算法…

abp模块生命周期设计思路剖析

abp中将生命周期事件抽象为4个接口&#xff1a;//预初始化 public interface IOnPreApplicationInitialization {void OnPreApplicationInitialization([NotNull] ApplicationInitializationContext context); }//初始化 public interface IOnApplicationInitialization {void …

蓝桥杯 迷宫与陷阱 BFS

参考代码&#xff1a; #include<bits/stdc.h> #define INF 0x3f3f3f3f using namespace std; typedef long long ll; struct node{int x, y, step, ticket;node(int a, int b, ll c, int d){xa, yb, stepc, ticketd;} }; queue<node> q; bool vis[1005][1005]; i…

.Net Core + 微信赋能企业级智能客服系统--学习笔记

摘要围绕目前需求猛增的微信及移动端企业智能客服业务&#xff0c;利用 .NET Core 的一系列优秀特性及 SignalR 模块打造全双工、跨微信/QQ/钉钉等应用平台、跨系统平台、跨终端、支持企业级并发的移动端客服系统。讲师介绍目录微信应用生态简介微信小程序基础通讯原理Senparc.…