重新整理 .net core 实践篇————网关中的身份签名认证[三十七]
前言
简单整理一下网关中的jwt,jwt用于授权认证的,其实关于认证授权这块https://www.cnblogs.com/aoximin/p/12268520.html 这个链接的时候就已经写了,当然只写到了4节,后面有10节没有写,是相对复杂的场景,后续会补齐。
正文
jwt 是json web tokens,是一种支持前面的数据结构。
至于什么是jwt的话,https://www.jianshu.com/p/576dbf44b2ae 这里有人写的比较好了。
然后前文也提及到为什么在网关做身份认证了,因为这样就不需要专门调用另外一个服务来实现身份认证,身份认证授权可以在网关和所以微服务同时生效。
教程直接在.net core文档里面搜索jwt即可查阅到。
那么就根据例子要演示一下:
首先加入对应的包:

在appsettings.json 中加入加密密钥:
"SecurityKey": "asdfghjklqwertyuiopzxcvbnm"
然后注入服务:
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["SecurityKey"]));
services.AddSingleton(securityKey);
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
{
}).AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ClockSkew = TimeSpan.FromSeconds(30),
ValidateIssuerSigningKey = true,
ValidAudience = "localhost",
ValidIssuer = "localhost",
IssuerSigningKey = securityKey
};
});
上面ValidateIssuer 、ValidateAudience 、ValidateLifetime 分别是验证Issuer、Audience、Lifetime这三个的,其实Issuer、Audience验证和不验证的话影响不大,主要是因为jwt随时可以解密出来,就是经过base64位的转换。
加入中间件:
app.UseAuthentication();
app.UseAuthorization();
测试代码:
[HttpGet]
public async Task<IActionResult> JwtLogin([FromServices]SymmetricSecurityKey securityKey,string userName)
{
List<Claim> claims = new List<Claim>();
claims.Add(new Claim("Name", userName));
var creds = new SigningCredentials(securityKey,SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
issuer:"localhost",
audience:"localhost",
claims:claims,
expires:DateTime.Now.AddMinutes(30),
signingCredentials:creds
);
var t = new JwtSecurityTokenHandler().WriteToken(token);
return Content(t);
}
然后调用生成jwt:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJOYW1lIjoiMTIzIiwiZXhwIjoxNjI1NjE0NDkyLCJpc3MiOiJsb2NhbGhvc3QiLCJhdWQiOiJsb2NhbGhvc3QifQ.lQg70rMofgue9X_RQ1ft_NDmXyY2OJbTZodN4krVOUM
然后通过下面网址进行解密:
https://www.box3.cn/tools/jwt.html

然后来测试一下这个是否生效:
[ApiController]
[Route("[controller]")]
public class OrderController : Controller
{
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme+","+CookieAuthenticationDefaults.AuthenticationScheme)]
public IActionResult oneApi()
{
return Content(User.FindFirst("name").Value);
}
}
上面[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme+","+CookieAuthenticationDefaults.AuthenticationScheme)]的意思是可以通过jwt验证也可以通过cookie来验证。
为什么要这么写呢?因为:
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
{
}).AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options ....
上面写了两种方式,且AddCookie在前,那么如果只写Authorize,那么默认是cookie,如果AuthenticationSchemes 为JwtBearerDefaults.AuthenticationScheme,那么只有jwt。
一般我们的项目中用jwt,但是因为有些网站刚开始的时候觉得方便用了cookie,后来因为有app接口,那么需要添加jwt,这里不是只app接口不能用cookie,而是不太方便。
那么效果如下:

可以看到传递了一个Authoization的参数,这个参数是约定参数,那么值就是Bearer加空格,然后后面接的就是jwt了,这些是约定。
那么返回了123,这个123就是我们jwt中Claim的key为name的值,调用就是User.FindFirst("name").Value,还是相当方便的。
当然我们也可以通过cookie来进行认证:
[HttpGet]
public async Task<IActionResult> CookieLogin(string userName)
{
var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
identity.AddClaim(new Claim("Name", userName));
await this.HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,new ClaimsPrincipal(identity));
return Content("login");
}
这样把cookie 传入到响应流中传递给前端。
然后访问:http://localhost:5000/account?username=ao
可以看到有个cookie。

那么访问一下刚才的oneApi接口,得到为:

那么这样就在网关实现了身份签名和认证了。那么如果其他服务需要进行认证的话,那么可以添加相同的认证方式即可。
细节篇介绍一下这个的源码。
结
下一节跨域请求的安全问题。
重新整理 .net core 实践篇————网关中的身份签名认证[三十七]的更多相关文章
- 重新整理 .net core 实践篇————网关[三十六]
前言 简单整理一下网关. 正文 在介绍网关之前,介绍一下BFF,BFF全称是Backend For Frontend,它负责认证授权,服务聚合,目标是为前端提供服务. 说的通透一点,就是有没有见过这种 ...
- 重新整理 .net core 实践篇————依赖注入应用之生命法则[三]
前言 该章演示依赖注入中,对象的释放行为. 紧接上文表示,演示: services.AddSingleton<IMySingletonService, MySingletonService> ...
- 重新整理 .net core 实践篇————配置应用[一]
前言 本来想整理到<<重新整理.net core 计1400篇>>里面去,但是后来一想,整理 .net core 实践篇 是偏于实践,故而分开. 因为是重新整理,那么就从配置开 ...
- 重新整理 .net core 实践篇————依赖注入应用[二]
前言 这里介绍一下.net core的依赖注入框架,其中其代码原理在我的另一个整理<<重新整理 1400篇>>中已经写了,故而专门整理应用这一块. 以下只是个人整理,如有问题, ...
- 重新整理 .net core 实践篇——— filter[四十四]
前言 简单介绍一下filter 正文 filter 的种类,微软文档中写道: 每种筛选器类型都在筛选器管道中的不同阶段执行: 授权筛选器最先运行,用于确定是否已针对请求为用户授权. 如果请求未获授权, ...
- 重新整理 .net core 实践篇——— 权限源码阅读四十五]
前言 简单介绍一下权限源码阅读一下. 正文 一直有人对授权这个事情上争论不休,有的人认为在输入账户密码给后台这个时候进行了授权,因为认为发送了一个身份令牌,令牌里面可能有些用户角色信息,认为这就是授权 ...
- 重新整理 .net core 实践篇————依赖注入应用之援军[四]
前言 介绍第三方依赖注入框架Autofac,看看为我们解决什么问题. 下面介绍4个点: 命名注册 属性注册 aop 注入 子容器命名 正文 为什么我们需要使用第三方框架?第三方框架为我们做了什么?第三 ...
- 重新整理 .net core 实践篇—————服务与配置之间[十一二]
前言 前面基本介绍了,官方对于asp .net core 设计配置和设计服务的框架的一些思路.看下服务和配置之间是如何联系的吧. 正文 服务: public interface ISelfServic ...
- 重新整理 .net core 实践篇—————日志系统之作用域[十七]
前言 前面介绍了服务与日志之间的配置,那么我们服务会遇到下面的场景会被遇到一些打log的问题. 前面我提及到我们的log,其实是在一个队列里面,而我们的请求是在并发的,多个用户同时发送请求这个时候我们 ...
随机推荐
- [转载]libvirt(virsh命令总结)
libvirt(virsh命令总结) virsh回车进入交互式界面: version pwd hostname 显示本节点主机名 nodeinfo 显示节点信息 list --all 显示所有云主机 ...
- ltp循环跑
e]# cat r3.sh#!/bin/bashi=1for ((; i<=1000; i++))do/opt/ltp/runltp -s fmtmsg01 -p -l -t -l /home/ ...
- mysql 无法执行select查询
场景:mysql无法执行select命令查询,对于已存在的数据库,除了mysql.information_schema数据库,其它诸如nova.keystone.cinder等数据库都有此现象. 日志 ...
- git 速度慢问题解决
使用VPN上网后,如果git下载速度还是很慢说明没有正确设置代理 查看你的代理模式是否是pac代理,如果是改成全局或者Http代理,pac代理会选择性的代理网站,可能会略过某些网站. 如果还是比较慢则 ...
- git push 时发生错误 error: src refspec master does not match any. error: failed to push some refs to
很多相关解决办法都是最后要 push 到远端的 master 上,但很多其实要求不能把个人的修改内容直接 push 到 master 主分支. 因此,当我想将本地 feature/work1 分支的修 ...
- 第4讲 | DHCP与PXE:IP是怎么来的,又是怎么没的?
第4讲 | DHCP与PXE:IP是怎么来的,又是怎么没的? linux 配置网络IP地址: 使用 net-tools: sudo ifconfig eth1 10.0.0.1/24 sudo ifc ...
- 痞子衡嵌入式:在SBL项目实战中妙用i.MXRT1xxx里SystemReset不复位的GPR寄存器
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1xxx里SystemReset不复位的GPR寄存器的小妙用. 我们知道稍大规模的项目代码设计一般都是多人协作完成的,在项目 ...
- 书列荐书 |《黑天鹅·如何应对不可预知的未来》【美】纳西姆 尼古拉斯 塔勒布 著
你不知道的事比你知道的事更有意义,因为生活中发生了许多微小的事情,尽管出现的概率非常小,但是却以某一种巨大的力量影响我们的生活.但是由于思维习惯的问题,导致我们看问题的方式使得我们不能很快地把握事物的 ...
- 设计模式Copy-on-write
1.Copy-on-Write 又称COW,写时复制 String的replace()方法,没有修改内部的value数组,而是新创建了一个不可变对象 这种方法在解决不可变对象时,经常使用 这其实就是一 ...
- TensorFlow分布式在Amazon AWS上运行
TensorFlow分布式在Amazon AWS上运行 Amazon AWS 提供采用 NVIDIA K8 GPU 的 P2.x 机器.为了能够使用,第一步还需要创建一个 Amazon AWS 账户, ...