.netcore实现jwt身份验证
前言
http协议本身是一种无状态的协议。所以客户端的每次请求,服务端是不清楚其身份的,需要客户端每次都要将身份信息传入,服务进行验证,才能达到安全验证的目的。
传统的Web用户验证:
1、客户端传入用户名和密码---2、后端验证成功后保存session信息,并将session信息返回给客户端--3、客户端保存session信息到cookie中---
4、客户端再请求需要的资源时,将cookie中的session信息传给服务端--5、服务端验证信息是否正确,正确则进行相应的操作,不正确则返回登录页面或者提示错误。
当然传统的session-cookie方式是可以达到用户身份验证的目的,但是在分布式的场景下就不好使了。因为session是存在当时对应的服务器中的,当我们部署多台服务器,并采用了负载均衡时,session不共享时,只能在其验证的服务器上才能通过,而无法达到多台服务器协同负载工作。(当然也可以通过将session信息存于数据库或者是分布式缓存中,每次需要验证时从数据库或者缓存中获取做验证,但是这样就多了一重数据库操作,或者是缓存出问题时无法验证)。
Token验证模式:
1、客户端使用用户名密码来请求服务器--2、服务器验证用户信息,成功则返回客户端一个token信息--3、客户端留存token信息,在每次请求时将token一并传给服务端--4、服务端验证token,正确则返回数据。
Jwt(Json web token), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的。它主要由3部分数据组成:头部(header),载荷(payload),签名(signature)。其实它就是token,服务端验证成功后按照算法组成jwt,返回给客户端;客户端请求服务端附带jwt,服务端验证jwt正确性,正确则返回对应的数据
.netcore实现jwt身份验证(同时集成swagger)
1、在appsettings.json文件中配置(注意这些配置信息的安全性,特别是secretkey。secretkey长度一般要求16位或以上)
"JwtSettings": {
"Issuer": "john_yong",
"Audience": "user",
"SecretKey": "123456789123456789"
},
2、在startup.cs的ConfigureServices(IServiceCollection services)方法中配置
services.Configure<JwtSetting>(Configuration.GetSection("JwtSettings"));
JwtSetting setting = new JwtSetting();
Configuration.Bind("JwtSettings", setting);
#region swagger
services.AddSwaggerGen(p =>
{
p.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo
{
Version = "v1",
Title = "SimpleTest API 接口文档",
//Contact = new OpenApiContact
//{
// Name = "john_yong",
// Email = "gxunet@163.com",
// Url = new Uri("http://xxxx.com"),
//},
});
//p.OperationFilter<HttpHeaderOperation>(); // 添加httpHeader参数
#region 启用swagger验证功能
p.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()
{
Description = "在下框中输入请求头中需要添加Jwt授权Token:Bearer Token",
Name = "Authorization",
In = ParameterLocation.Header,
Type = SecuritySchemeType.ApiKey,
BearerFormat = "JWT",
Scheme = "Bearer"
});
p.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference {
Type = ReferenceType.SecurityScheme,
Id = "Bearer"
}
},
new string[] { }
}
});
#endregion
// 为 Swagger JSON and UI设置xml文档注释路径
var xmlPath = Path.Combine(AppContext.BaseDirectory, "SimpleTestApplication.xml");
p.IncludeXmlComments(xmlPath );
});
#endregion
#region 添加验证服务
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(p =>
{
p.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ClockSkew = TimeSpan.FromSeconds(30),
ValidateIssuerSigningKey = true,
ValidAudience = setting.Audience,
ValidIssuer = setting.Issuer,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(setting.SecretKey))
};
});
#endregion
在 Configure(IApplicationBuilder app, IWebHostEnvironment env)方法中配置
//启用授权
app.UseAuthentication(); app.UseAuthorization();
JwtSetting.cs
/// <summary>
///
/// </summary>
public class JwtSetting
{
/// <summary>
/// 证书颁发者
/// </summary>
public string Issuer { get; set; } /// <summary>
/// 角色
/// </summary>
public string Audience { get; set; } /// <summary>
/// 加密字符串
/// </summary>
public string SecretKey { get; set; }
}
3、创建AuthController提供api验证获取jwt
[ApiController]
[Route("[controller]")]
public class AuthController : Controller
{
private JwtSetting _jwtSettings;
public AuthController(IOptions<JwtSetting> jwtSetting)
{
_jwtSettings = jwtSetting.Value;
}
/// <summary>
/// 获取token
/// </summary>
/// <param name="userName"></param>
/// <param name="pwd"></param>
/// <returns></returns>
[AllowAnonymous]
[HttpGet("getToken")]
public ResponseFormatDto<TokenInfo> GetToken(string userName, string pwd)
{
double expiredMinute = 30; //过期时间30分钟
DateTime expiredTime = DateTime.Now.AddMinutes(expiredMinute);
//TODO验证用户
if (userName == "admin" && pwd == "1234560")
{
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Nbf,$"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}") ,
new Claim (JwtRegisteredClaimNames.Exp,$"{new DateTimeOffset(expiredTime).ToUnixTimeSeconds()}"),
new Claim(ClaimTypes.Name, userName)
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtSettings.SecretKey));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var jwtSecurityToken = new JwtSecurityToken(
issuer: _jwtSettings.Issuer,
audience: _jwtSettings.Audience,
claims: claims,
expires: expiredTime,
signingCredentials: creds);
string token = new JwtSecurityTokenHandler().WriteToken(jwtSecurityToken);
TokenInfo tokenInfo = new TokenInfo()
{
Token = token,
Expired = expiredTime
};
return HelperTool.GetResponse(tokenInfo); }
else
{
return HelperTool.GetResponse<TokenInfo>(null, Status.Fail, "username or password is incorrect.");
}
}
}
TokenInfo.cs
/// <summary>
/// token information
/// </summary>
public class TokenInfo
{
/// <summary>
/// token
/// </summary>
public string Token { get; set; }
/// <summary>
/// 过期时间
/// </summary>
public DateTime Expired { get; set; } }
HelperTool.cs是简单通用的构造统一的返回实体ResponseFormatDto(此处略)
结果示例

-------------------------------------
.netcore实现jwt身份验证的更多相关文章
- Spring Cloud系列-Zuul网关集成JWT身份验证
前言 这两三年项目中一直在使用比较流行的spring cloud框架,也算有一定积累,打算有时间就整理一些干货与大家分享. 本次分享zuul网关集成jwt身份验证 业务背景 项目开发少不了身份认证,j ...
- ASP.NET Core Web API中带有刷新令牌的JWT身份验证流程
ASP.NET Core Web API中带有刷新令牌的JWT身份验证流程 翻译自:地址 在今年年初,我整理了有关将JWT身份验证与ASP.NET Core Web API和Angular一起使用的详 ...
- Asp.Net Core 5 REST API 使用 JWT 身份验证 - Step by Step
翻译自 Mohamad Lawand 2021年1月22日的文章 <Asp Net Core 5 Rest API Authentication with JWT Step by Step> ...
- IdentityServer4之Jwt身份验证方案分析
一,准备内容 在之前讲过的asp.net core 实现OAuth2.0四种模式系列中的IdentityApi客户端用到了以下配置代码 public void ConfigureServices(IS ...
- springmvc文件上传AND jwt身份验证
SpringMVC文件上传 思路:1.首先定义页面,定义多功能表单(enctype=“multipart/form-data”)2.在Controller里面定义一个方法,用参数(MultipartF ...
- .netcore 自定义多种身份验证方法混用
背景: 公司项目有很多租户,每个租户的系统都可能调用我们的租户服务,原来的解决方案是为每个租户提供一个service.随着租户的增多,service也多了起来,但是每个service里的逻辑都是一样的 ...
- asp.core 同时兼容JWT身份验证和Cookies 身份验证两种模式
在实际使用中,可能会遇到,aspi接口验证和view页面的登录验证情况.asp.core 同样支持两种兼容. 首先在startup.cs 启用身份验证. var secrityKey = new Sy ...
- Jwt身份验证
转载自博友(TerryTon) 1.因为json是通用的,所以jwt可以在绝大部分平台可以通用,如java,python,php,.net等 2.基于jwt是无状态的,jwt可以用于分布式等现在比 ...
- .NET CORE WebAPI JWT身份验证
一.appsettings.Json文件配置 配置JWT公用参数. 1 /*JWT设置*/ 2 "JwtSetting": { 3 "Issuer": &quo ...
随机推荐
- .Net Core 2.2 存取Cookie
第一步(注释代码):注释Startup.cs中 ConfigureServices 函数中的 options.CheckConsentNeeded = context => true; 第二步 ...
- KEIL查看ARM-Cortex M架构soc的内核寄存器之 MSP
参考下图stm32l475的参考手册: MSP指向地址基地址为0x20000000的内存处.参考STM32L475的memory map可知MSP指向的是SRAM的一块地址.并且由上面的编译信息 ...
- Clover 引导 Windows 及 Linux 双系统
Clover 引导 Windows 及 Linux 双系统UEFI cnblogs @ Orcim 此 文比较详细地介绍了通过修改 Clover 的配置文件,添加 Clover 启动项的方法(添加 ...
- html 背景花瓣特效--1
html背景樱花可以用js添加,将<script>标签复制到<body>标签下就可以,javascript脚本点击 <!DOCTYPE html> <html ...
- TTL和CMOS电平
参考: 1.https://baike.baidu.com/item/TTL%E7%94%B5%E5%B9%B3/5904345 2.https://baike.baidu.com/item/CMOS ...
- OpenStack最新版本--Victoria发布亮点与初体验
前言 `OpenStack`是一个云操作系统,可控制整个数据中心内的大型计算,存储和网络资源池,所有资源均通过具有通用身份验证机制的`API`进行管理和配置. 还提供了一个仪表板,可让管理员进行控制, ...
- 分布式锁结合SpringCache
1.高并发缓存失效问题: 缓存穿透: 指查询一个一定不存在的数据,由于缓存不命中导致去查询数据库,但数据库也无此记录,我们没有将此次查询的null写入缓存,导致这个不存在的数据每次请求都要到存储层进行 ...
- spring boot: 通过filter过滤器实现中文的简体繁体字符集转换(spring boot 2.3.1)
一,为什么要使用filter来实现简繁体转换? 项目中有时会有同时支持简体和繁体两种字符集的要求, 或者搜索引擎有支持繁体输入字符的需求. 针对繁体字符的显示, 我们通常会在数据库和模板.文案配置中默 ...
- centos8使用hostnamectl管理主机名称
一,查看hostnamectl所属的包: [root@yjweb ~]# whereis hostnamectl hostnamectl: /usr/bin/hostnamectl /usr/shar ...
- python 操作conf配置文件方法
参考文章链接:https://blog.csdn.net/qq_23587541/article/details/85019610