前言:
OceLot 网关是基于 AspNetCore 产生的可扩展的高性能的企业级 Api 网关, 目前已经基于 2.0 升级版本升级, 在使用 AspNetCore 开发的时候可以使用 2.0 版本了,
开源项目 Ocelot 张大队长是主力的参与人员, 以前提起张大队前面都会加个腾讯, 张大队于 2018 年 8 月 8 日 正式离开了腾讯, 回归了真我, 这里祝张大队: 事事顺心.
OceLot 是开源的, 开源协议是 MIT, 所以我们可以大胆放心的使用.
OceLot 的 GitHub 地址: https://github.com/ThreeMammals/Ocelot
OceLot 的中文文档: https://blog.csdn.net/sD7O95O/article/details/79623654
目前 OceLot 已经成为了一个使用 AspNetCore 几乎 必会的一项技术了, 所以关注, 并且要学习, 或者已经在使用的. net 开发人员可以关注并学习了解一下 OceLot,
Ocelot 的功能:
1, 基于 IdentityServer4 的认证
2,Consul 的注册发现
3, 单机的限流控制
4, 基于 Polly 的使用
5, 支持 Http 以及其他的 rpc 通讯
6, 网关集群
等功能,
可以看出非常的强大. 接下来我们将 Ocelot 的功能基于 AspNetCore 进行实现. 首先学习一下 IdentityServer4
1, 基于 IdentityServer4 的认证
在使用之前我们先明白 IdentityServer4 是什么以及使用原理.
文档地址: http://docs.identityserver.io/en/release/
中文文档: 网上也有 推荐 :https://www.cnblogs.com/ideck/
IdentityServer 认证的作用是, 不是谁想登录我的 web 就能登录的, 也不是谁想使用我的接口就能使用的, 不经过我的同意就想使用我的服务那是不存在的, 除非你是故意的.
我们说一个故事.
怎么说呢, 认证其实就是一把钥匙, 打开一扇门的钥匙, 就好比几个人一起租房子一样, 该房门的钥匙是指纹的, 房东只给四个人授权了指纹开门的权限, 现在有四个人可以进屋了, 但是我们有五个人要进屋, 但是房东只授权我们其中四个人了, 还有一人没有钥匙, 但是每多配一把钥匙, 需要向房东申请授权, 申请通过后才能指纹开锁, 这个人才能进屋, 我们变要求房东在授权一个人, 但是这时候房东说了那位哥们看起来不像是好人不给授权, 如果以后回来了敲门, 确定是你后我来给开门, 后来这哥们气不过通过私下操作也能开门了, 有一天被发现了, 该哥们便失去了租住的权利了.
这里的钥匙就是秘钥, 有秘钥了才能有进行访问程序的权限, 但是秘钥只有授权后才能使用, 事实上没有经过授权的秘钥是不能进行程序访问的, 但是万事都不是绝对的, 安全一直是我们所关注的问题, 就好比一把简单的钥匙, 经过违规操作, 就能打开一扇门, 危害我们的安危, 这把违规的钥匙告诉我们的是, 秘钥要严加看管, 轻易不要暴露给别人, 安全也要加强不要轻易放松.
IdentityServer4 的规则:
1, 我们常见的程序之间的交互方式有:
2, 浏览器和 web 之间的通信:
3,Web 于 Api 之间的通信:
4, 用户于 Api 之间的通信:
5, 浏览器程序 于 Api 之间的通信:
6, 服务器程序 于 Api 通讯:
7,Api 之间的相互通讯:
为了保证安全我们创建一个安全令牌的服务, 用来管理通信之间的基础安全, 并不是说有了安全令牌服务就绝对安全了, 为了安全我们还需要做到更多, 没有绝对的安全存在.
IdentityServer4 具体能用在什么地方:
因为 IdentityServer4 是一款包含了, 授权 (OAuth2) 与认证 (OpendID) 协议的框架.
具体什么是 OAuth2 和 OpendID 我们以上文的故事来分析一下, 授权 (OAuth2) 就是房东给租户授权的钥匙一样, 我们拿到授权的钥匙后, 可以随意的进出房子, 但是那个倒霉的哥们没有没有授权, 每次回家都需要先让房东证明他是他 (认证(OpendID 代表着是本人) 后才能进出房子, 每次进屋都需要证明自己, 这样进出屋就不是很方便了, 权限明显没有被授权 (OAuth2) 的人高.
如果通过我的描述还不是很清楚的, 可以搜索一下具体的区别, 我想收获会更大.
推荐一个地址: https://www.jianshu.com/p/5d535eee0a9
有了这两样东西后我们可以做以下事情(不包括所有):
1, 可以做单点登录的功能
2, 可以做身份验证
3, 可以做 Api 访问权限的控制
4, 也可以做第三方登录
IdentityServer4 是灵活的, 我们可以根据我们的需求去使用他, IdentityServer 有效的保护资源不受破坏.
大致使用流程如下图所示: 官方的图:
搭建第一个 IdentityServer 入门程序
1, 创建 AspNetCore 空白 Web 程序
2, 在程序控制台中添加 IdentityServer4 的包 安装命令获取地址 : https://www.nuget.org/packages/IdentityServer4
安装如图所示:
使用命令 Install-Package IdentityServer4 -Version 2.2.0
3, 在 StartUP 中这样使用: 下面就不过多的描述了, 大多数都写在代码中:
在 ConfigureServices 中写入如下:
- public void ConfigureServices(IServiceCollection services)
- {
- // 注入服务
- services.AddIdentityServer().
- AddDeveloperSigningCredential()// 扩展程序为签名令牌创建临时密钥材料
- .AddInMemoryClients(Config.GetClients())// 基于配置对象的内存中集合的注册 IClientStore 和 ICorsPolicyService 实现 Client
- .AddInMemoryApiResources(Config.GetApiResources());//IResourceStore 根据 ApiResource 配置对象的内存中集合注册实现
- }
在 Configure 注入:
- public void Configure(IApplicationBuilder app, IHostingEnvironment env)
- {
- if (env.IsDevelopment())
- {
- app.UseDeveloperExceptionPage();
- }
- // 注入 HTTP 管道中
- app.UseIdentityServer();
- app.Run(async (context) =>
- {
- await context.Response.WriteAsync("Hello World!");
- });
- }
新建配置类 Config:
- using IdentityServer4.Models;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Threading.Tasks;
- namespace InentityServer4_1
- {
- public class Config
- {
- /// <summary>
- /// 返回收保护的 Api 集合
- /// </summary>
- /// <returns></returns>
- public static IEnumerable<ApiResource> GetApiResources()
- {
- List<ApiResource> resources = new List<ApiResource>();
- //ApiResource 第一个参数是应用的名字, 第二个参数是描述
- resources.Add(new ApiResource("API", "接口 API"));
- return resources;
- }
- /// <summary>
- /// 定义客户信息列表
- /// </summary>
- /// <returns></returns>
- public static IEnumerable<Client> GetClients()
- {
- List<Client> clients = new List<Client>();
- clients.Add(new Client
- {
- ClientId = "clientID",//API 账号, 客户端 Id
- // 客户端验证凭证授权类型
- AllowedGrantTypes = GrantTypes.ClientCredentials,
- //ClientSecrets 认证秘钥
- ClientSecrets =
- {
- //SHA 安全散列算法 是一个密码散列函数家族, 是 FIPS 所认证的安全散列算法. 能计算出一个数字消息所对应到的, 长度固定的字符串 (又称消息摘要) 的算法. 且若输入的消息不同, 它们对应到不同字符串的机率很高.
- new Secret("123321".Sha256(),"用户秘钥")// 秘钥
- },
- //AllowedScopes 定义当秘钥验证通过后允许访问的资源
- // 多个使用 逗号隔开 如 AllowedScopes = { "API","API1","API1" }
- AllowedScopes = { "API" }
- });
- return clients;
- }
- }
- }
4, 运行项目后根据启动的端口后面加上:.well-known/openid-configuration 可以得到配置信息的内容:
我的是默认的 5000 端口 如访问: http://localhost:5000/.well-known/openid-configuration
这样身份认证服务就 Ok 了.
来源: https://www.cnblogs.com/szlblog/p/9452045.html