上一章快速陈述了自定义验证功能添加的过程,我的第一个netcore2.2 api项目搭建(三)

但是并没有真正的去实现,这一章将要实现验证功能的添加。

这一章实现目标三:jwt认证授权添加

在netcore2.2中,只要添加很简单的配置就能添加jwt功能了。至于jwt本身是啥大家自行去了解,这里不做多说了。。

1.1添加JwtHelper类

public class JwtHelper
{
public const string Audience = "JH.OPEMR.API";
public const string Issuer = "all";
public const string SigningKey = "my first security key"; public static string CreateJwtToken(string uid, string uName, string sub)
{
var dateTime = DateTime.UtcNow;
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(SigningKey)); var tokenHandler = new JwtSecurityTokenHandler();
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new Claim[]
{
new Claim(JwtClaimTypes.Audience,Audience),
new Claim(JwtClaimTypes.Issuer,Issuer),
new Claim(JwtClaimTypes.Id, uid),
new Claim(JwtClaimTypes.Name, uName),
new Claim("Role", sub)//高亮,很重要
}),
Expires = dateTime.AddHours(0.5),
SigningCredentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
var tokenString = tokenHandler.WriteToken(token);
return tokenString;
}
}

这个类就一个方法,提供生成加密的jwt串

1.2在Startup做配置:

//注册默认认证方式,这里使用jwt方式
services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(o =>
{
o.TokenValidationParameters = new TokenValidationParameters
{
RoleClaimType = JwtClaimTypes.Role,//这个很重要 ValidIssuer = JwtHelper.Issuer,
ValidAudience = JwtHelper.Audience,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(JwtHelper.SigningKey)) /***********************************TokenValidationParameters的参数默认值***********************************/
// RequireSignedTokens = true,
// SaveSigninToken = false,
// ValidateActor = false,
// 将下面两个参数设置为false,可以不验证Issuer和Audience,但是不建议这样做。
// ValidateAudience = true,
// ValidateIssuer = true,
// ValidateIssuerSigningKey = false,
// 是否要求Token的Claims中必须包含Expires
// RequireExpirationTime = true,
// 允许的服务器时间偏移量
// ClockSkew = TimeSpan.FromSeconds(300),
// 是否验证Token有效期,使用当前时间与Token的Claims中的NotBefore和Expires对比
// ValidateLifetime = true
};
});

可以看出,JwtHelper里的几个变量在Startup中也使用了,这样就保证了配置的参数和生成jwt串的参数保持了一致,这样就能起到防伪作用了,不是千千万万个jwt串在咱系统都能通过,如果都通过了,那不是搞笑么。。。

1.3启用验证

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
        //启用验证
app.UseAuthentication(); //启用验证中间件
//app.UseMiddleware<MyAutoMiddleware>(); //启用Swagger
app.UseSwagger();
app.UseSwaggerUI(options =>
{
options.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"); }); app.UseMvc();
}

在前一章中,咱们并没有调用app.UseAuthentication(),是因为上一章咱们自己启用了中间件,并没有启用2.2注入的验证方式。而这一章,咱们注入了jwt,就得调用这句话是执行验证授权了。一旦启用,jwt就会自行进行请求的验证功能,不需要咱们在写代码了。。。

ok,F5运行

可以看到,未验证,调用失败。。

咱们先用postman调用login模拟登录,生成一个jwt串,代码很简单:

/// <summary>
/// Account 模块
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
public class AccountController : ControllerBase
{
[HttpGet]
public ActionResult<string> Login(long Uid, string UName, string Sub)
{
if (string.IsNullOrWhiteSpace(Uid.ToString()) || string.IsNullOrWhiteSpace(UName)) throw new Exception("填写正确用户"); var tokenString = JwtHelper.CreateJwtToken(Uid.ToString(), UName, Sub); return tokenString;
}
}

这里我们得到jwt字符串,将这个字符串添加到header中,再用postman调用get试试:

Headers添加 Authorization ,值:Bearer +jwt串,在Bearer后有个空格记住。

ok了,是不是很简单,到这里jwt简单的认证授权其实已经加完了,后面可以根据各种权限去维护就好了。。。

至此,第三个目标完成!

既然添加了认证授权,那么第二章swagger部分就得也加入该功能了,这个很简单,只要在swagger里做配置就ok了。

//添加header身份验证信息
var security = new Dictionary<string, IEnumerable<string>> { { "Bearer", new string[] { } }, };
options.AddSecurityRequirement(security);
options.AddSecurityDefinition("Bearer", new ApiKeyScheme
{
Description = "JWT授权(数据将在请求头中进行传输) 参数结构: \"Authorization: Bearer {token}\"",
Name = "Authorization",//jwt默认的参数名称
In = "header",
Type = "apiKey"
});

F5运行,可以看见加了锁

点击Authorize,然后配置下:

再来调用get:

调用成功,可以看到header发送了刚刚添加的jwt串。

至此,整个netcore api项目简单搭建已经完成!

不过,按这种验证写法,突然想到,如果前端被劫持了jwt串,然后其他应用在此jwt串有效期内利用该jwt串调用api,不是也能调通吗??如果这样,不是很危险吗,竟然被别人给瞎调用了,这里留下了深深的思考,不知道大家都是怎么做的。。知情者可否留下解决方式,膜拜!!!

我的第一个netcore2.2 api项目搭建(三)续的更多相关文章

  1. 我的第一个netcore2.2 api项目搭建(三)

    上一章快速添加了swagger文档管理功能,我的第一个netcore2.2 api项目搭建(二) 这一章实现目标三:api添加身份验证功能 在实现该目标之前,先得理解netcore运行机制. 这是微软 ...

  2. 我的第一个netcore2.2 api项目搭建(二)

    上一章快速使用SqlSugar搭建了netcore api项目,我的第一个netcore2.2 api项目搭建(一) 这一章实现目标二:api使用Swagger,实现api文档管理 效果图:第一张收缩 ...

  3. 我的第一个netcore2.2 api项目搭建(一)

    早早就想入门netcore,一直没下定决心,这次正好碰上项目服务变更,便想着入坑试试,边学边用. 目标: 一.api使用core版的SqlSugar,集成orm,实现快速开发 二.api使用Swagg ...

  4. 通过beego快速创建一个Restful风格API项目及API文档自动化

    通过beego快速创建一个Restful风格API项目及API文档自动化 本文演示如何快速(一分钟内,不写一行代码)的根据数据库及表创建一个Restful风格的API项目,及提供便于在线测试API的界 ...

  5. 通过beego快速创建一个Restful风格API项目及API文档自动化(转)

    通过beego快速创建一个Restful风格API项目及API文档自动化 本文演示如何快速(一分钟内,不写一行代码)的根据数据库及表创建一个Restful风格的API项目,及提供便于在线测试API的界 ...

  6. .Net Core 3.1浏览器后端服务(一) Web API项目搭建

    一.前言 基于CefSharp开发的浏览器项目已有一段时间,考虑到后期数据维护需要Server端来管理,故开启新篇章搭建浏览器后端服务.该项目前期以梳理服务端知识为主,后期将配合CefSharp浏览器 ...

  7. 简单创建一个SpringCloud2021.0.3项目(三)

    目录 1. 项目说明 1. 版本 2. 用到组件 3. 功能 2. 上俩篇教程 3. Gateway集成sentinel,网关层做熔断降级 1. 超时熔断降级 2. 异常熔断 3. 集成sentine ...

  8. vuejs学习——vue+vuex+vue-router项目搭建(三)

    前言 vuejs学习——vue+vuex+vue-router项目搭建(一) vuejs学习——vue+vuex+vue-router项目搭建(二) 为什么用vuex:组件之间的作用域独立,而组件之间 ...

  9. 跟我一起做一个vue的小项目(三)

    接下来我们进行轮播的开发 安装插件,选用2.6.7的稳定版本 npm install vue-awesome-swiper@2.6.7 --save 根据其github上面的用法,我们在全局引用,在m ...

随机推荐

  1. Elasticsearch高版本安装head插件

    安装Elasticsearch 1.安装Elasticsearch-6.5.4.tar.gz [merce@info5 ~]$ cd /appmerce/zrapp/ [merce@info5 zra ...

  2. The Preliminary Contest for ICPC Asia Shenyang 2019 F. Honk's pool

    题目链接:https://nanti.jisuanke.com/t/41406 思路:如果k的天数足够大,那么所有水池一定会趋于两种情况: ① 所有水池都是一样的水位,即平均水位 ② 最高水位的水池和 ...

  3. Spring Boot Admin 详解(Spring Boot 2.0,基于 Eureka 的实现)

    原文:https://blog.csdn.net/hubo_88/article/details/80671192 Spring Boot Admin 用于监控基于 Spring Boot 的应用,它 ...

  4. 大数据技术原理与应用:【第二讲】大数据处理架构Hadoop

    2.1 Hadoop概论 创始人:Doug Cutting 1.简介: 开源免费; 操作简单,极大降低使用的复杂性; Hadoop是Java开发的; 在Hadoop上开发应用支持多种编程语言.不限于J ...

  5. 京东js加密 nloginpwd 破解

    京东登录,有一个参数nloginpwd,是加密字段. 第一步:浏览器抓包 第二部:搜索加密字段 js 代码 第三部: 下断点 2. js代码: var navigator = {}; var wind ...

  6. python基础语法17 面向对象4 多态,抽象类,鸭子类型,绑定方法classmethod与staticmethod,isinstance与issubclass,反射

    多态 1.什么是多态? 多态指的是同一种类型的事物,不同的形态. 2.多态的目的: “多态” 也称之为 “多态性”,目的是为了 在不知道对象具体类型的情况下,统一对象调用方法的规范(比如:名字). 多 ...

  7. apache在linux下安装

    yum安装 主流Linux系统版本基本上都集成了apache服务器httpd,我们可以通过如下命令来查看我们的操作系统上是否已经安装了apache服务器httpd rpm -qa | grep htt ...

  8. 架构篇 | 带你轻松玩转 LAMP 网站架构平台(一)

    作者 | JackTian 微信公众号 | 杰哥的IT之旅(ID:Jake_Internet) 转载请联系授权(微信ID:Hc220066)备注:来自博客园 1.什么是 LAMP 架构? LAMP 架 ...

  9. 终极 Shell——ZSH

    https://zhuanlan.zhihu.com/p/19556676 在开始今天的 MacTalk 之前,先问两个问题吧: 1.相对于其他系统,Mac 的主要优势是什么?2.你们平时用哪种 Sh ...

  10. Scheme、Claim、ClaimsIdentity、ClaimsPrincipal介绍

    在 token 创建.校验的整个生命周期中,都涉及到了  Scheme.Claim.ClaimsIdentity.ClaimsPrincipal 这些概念,如果你之前有使用过微软的 Identity ...