.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 ...
随机推荐
- 004 01 Android 零基础入门 01 Java基础语法 01 Java初识 04 Java程序的结构
004 01 Android 零基础入门 01 Java基础语法 01 Java初识 04 Java程序的结构 Java程序的结构 Java程序外层--类 程序外层,如下面的代码,是一个类的定义. c ...
- [POI2010]PIL-Pilots 单调队列
[POI2010]PIL-Pilots 题意: 给定一个序列和一个数值k,求一段连续最大区间是的最大值与最小值之差小于k: 思路: 因为要维护最大值和最小值并且连续,使用两个单调队列分别同时维护最大最 ...
- .NET 云原生架构师训练营(模块一 架构师与云原生)--学习笔记
目录 什么是软件架构 软件架构的基本思路 单体向分布式演进.云原生.技术中台 1.1 什么是软件架构 1.1.1 什么是架构? Software architecture = {Elements, F ...
- fastadmin 增加批量操作字段 提示无权限
是这样的找了权限节点的问题,始终找不到,后来 在社区传世人回答别人问题是提及到 $multiFields 就全局搜了下 在基类 Backend 里找到了这个.然后拿到 控制器中添加需要的参数 再次尝 ...
- golang 进行grpc调用
参考https://blog.csdn.net/qq_32744005/article/details/105606383 go get google.golang.org/grpc go get - ...
- MeteoInfoLab脚本示例:中尺度气旋散点图
全球长时间序列中尺度气旋数据(http://cioss.coas.oregonstate.edu/eddies/)有netCDF格式,散点数据类型,只有一个很大的维Nobs = 2590938.尝试读 ...
- 浅谈MircoPython---ESP8266
一.连接WIFI 在Putty会话窗口输入 >>>help() 打印的消息会告诉你如何连接WIFI import network sta_if = network.WLAN(netw ...
- centos 开机启动服务 systemctl
systemctl 实现开机自启服务 转载起一个好听的名字 最后发布于2018-06-26 13:49:06 阅读数 13473 收藏 展开 systemctl是RHEL 7 的服务管理工具中主要的 ...
- lerna管理前端模块实践
最近在工作中使用了 lerna 进行前端包的管理,效率提升了很多.所以打算总结一下最近几个月使用 lerna 的一些心得.有那些不足的地方,请包涵. 该篇文章主要包括在使用 lerna 的一些注意事项 ...
- js实现无缝连接轮播图(二)实现自定义属性,根据banner图片的数量动态生成小圆点
<!-- 这个animate.js 必须写到 index.js的上面引入 --><script src="js/animate.js"></scrip ...