前言

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位或以上)

  1. "JwtSettings": {
  2. "Issuer": "john_yong",
  3. "Audience": "user",
  4. "SecretKey": "123456789123456789"
  5. },

2、在startup.cs的ConfigureServices(IServiceCollection services)方法中配置

  1.      services.Configure<JwtSetting>(Configuration.GetSection("JwtSettings"));
  2.      JwtSetting setting = new JwtSetting();
  3.      Configuration.Bind("JwtSettings", setting);
  4.  
  5.       #region swagger
  6. services.AddSwaggerGen(p =>
  7. {
  8. p.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo
  9. {
  10. Version = "v1",
  11. Title = "SimpleTest API 接口文档",
  12. //Contact = new OpenApiContact
  13. //{
  14. // Name = "john_yong",
  15. // Email = "gxunet@163.com",
  16. // Url = new Uri("http://xxxx.com"),
  17. //},
  18. });
  19.  
  20. //p.OperationFilter<HttpHeaderOperation>(); // 添加httpHeader参数
  21. #region 启用swagger验证功能
  22. p.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()
  23. {
  24. Description = "在下框中输入请求头中需要添加Jwt授权Token:Bearer Token",
  25. Name = "Authorization",
  26. In = ParameterLocation.Header,
  27. Type = SecuritySchemeType.ApiKey,
  28. BearerFormat = "JWT",
  29. Scheme = "Bearer"
  30. });
  31. p.AddSecurityRequirement(new OpenApiSecurityRequirement
  32. {
  33. {
  34. new OpenApiSecurityScheme
  35. {
  36. Reference = new OpenApiReference {
  37. Type = ReferenceType.SecurityScheme,
  38. Id = "Bearer"
  39. }
  40. },
  41. new string[] { }
  42. }
  43. });
  44. #endregion
  45. // 为 Swagger JSON and UI设置xml文档注释路径
  46. var xmlPath = Path.Combine(AppContext.BaseDirectory, "SimpleTestApplication.xml");
  47.  
  48. p.IncludeXmlComments(xmlPath );
  49. });
  50.  
  51. #endregion
  52. #region 添加验证服务
  53. services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
  54. .AddJwtBearer(p =>
  55. {
  56. p.TokenValidationParameters = new TokenValidationParameters
  57. {
  58. ValidateIssuer = true,
  59. ValidateAudience = true,
  60. ValidateLifetime = true,
  61. ClockSkew = TimeSpan.FromSeconds(30),
  62. ValidateIssuerSigningKey = true,
  63. ValidAudience = setting.Audience,
  64. ValidIssuer = setting.Issuer,
  65. IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(setting.SecretKey))
  66. };
  67. });
  68. #endregion

在 Configure(IApplicationBuilder app, IWebHostEnvironment env)方法中配置

  1. //启用授权
  2. app.UseAuthentication();
  3.  
  4. app.UseAuthorization();


  1. JwtSetting.cs

  1. /// <summary>
  2. ///
  3. /// </summary>
  4. public class JwtSetting
  5. {
  6. /// <summary>
  7. /// 证书颁发者
  8. /// </summary>
  9. public string Issuer { get; set; }
  10.  
  11. /// <summary>
  12. /// 角色
  13. /// </summary>
  14. public string Audience { get; set; }
  15.  
  16. /// <summary>
  17. /// 加密字符串
  18. /// </summary>
  19. public string SecretKey { get; set; }
  20. }
  1. 3、创建AuthController提供api验证获取jwt
  1. [ApiController]
  2. [Route("[controller]")]
  3. public class AuthController : Controller
  4. {
  5. private JwtSetting _jwtSettings;
  6. public AuthController(IOptions<JwtSetting> jwtSetting)
  7. {
  8. _jwtSettings = jwtSetting.Value;
  9. }
  10. /// <summary>
  11. /// 获取token
  12. /// </summary>
  13. /// <param name="userName"></param>
  14. /// <param name="pwd"></param>
  15. /// <returns></returns>
  16. [AllowAnonymous]
  17. [HttpGet("getToken")]
  18. public ResponseFormatDto<TokenInfo> GetToken(string userName, string pwd)
  19. {
  20. double expiredMinute = 30; //过期时间30分钟
  21. DateTime expiredTime = DateTime.Now.AddMinutes(expiredMinute);
  22. //TODO验证用户
  23. if (userName == "admin" && pwd == "1234560")
  24. {
  25. var claims = new[]
  26. {
  27. new Claim(JwtRegisteredClaimNames.Nbf,$"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}") ,
  28. new Claim (JwtRegisteredClaimNames.Exp,$"{new DateTimeOffset(expiredTime).ToUnixTimeSeconds()}"),
  29. new Claim(ClaimTypes.Name, userName)
  30. };
  31. var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtSettings.SecretKey));
  32. var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
  33. var jwtSecurityToken = new JwtSecurityToken(
  34. issuer: _jwtSettings.Issuer,
  35. audience: _jwtSettings.Audience,
  36. claims: claims,
  37. expires: expiredTime,
  38. signingCredentials: creds);
  39. string token = new JwtSecurityTokenHandler().WriteToken(jwtSecurityToken);
  40. TokenInfo tokenInfo = new TokenInfo()
  41. {
  42. Token = token,
  43. Expired = expiredTime
  44. };
  45. return HelperTool.GetResponse(tokenInfo);
  46.  
  47. }
  48. else
  49. {
  50. return HelperTool.GetResponse<TokenInfo>(null, Status.Fail, "username or password is incorrect.");
  51. }
  52. }
  53. }

TokenInfo.cs

  1. /// <summary>
  2. /// token information
  3. /// </summary>
  4. public class TokenInfo
  5. {
  6. /// <summary>
  7. /// token
  8. /// </summary>
  9. public string Token { get; set; }
  10. /// <summary>
  11. /// 过期时间
  12. /// </summary>
  13. public DateTime Expired { get; set; }
  14.  
  15. }
  1. HelperTool.cs是简单通用的构造统一的返回实体ResponseFormatDto(此处略)

    结果示例



  1. -------------------------------------
  1.  

.netcore实现jwt身份验证的更多相关文章

  1. Spring Cloud系列-Zuul网关集成JWT身份验证

    前言 这两三年项目中一直在使用比较流行的spring cloud框架,也算有一定积累,打算有时间就整理一些干货与大家分享. 本次分享zuul网关集成jwt身份验证 业务背景 项目开发少不了身份认证,j ...

  2. ASP.NET Core Web API中带有刷新令牌的JWT身份验证流程

    ASP.NET Core Web API中带有刷新令牌的JWT身份验证流程 翻译自:地址 在今年年初,我整理了有关将JWT身份验证与ASP.NET Core Web API和Angular一起使用的详 ...

  3. 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> ...

  4. IdentityServer4之Jwt身份验证方案分析

    一,准备内容 在之前讲过的asp.net core 实现OAuth2.0四种模式系列中的IdentityApi客户端用到了以下配置代码 public void ConfigureServices(IS ...

  5. springmvc文件上传AND jwt身份验证

    SpringMVC文件上传 思路:1.首先定义页面,定义多功能表单(enctype=“multipart/form-data”)2.在Controller里面定义一个方法,用参数(MultipartF ...

  6. .netcore 自定义多种身份验证方法混用

    背景: 公司项目有很多租户,每个租户的系统都可能调用我们的租户服务,原来的解决方案是为每个租户提供一个service.随着租户的增多,service也多了起来,但是每个service里的逻辑都是一样的 ...

  7. asp.core 同时兼容JWT身份验证和Cookies 身份验证两种模式

    在实际使用中,可能会遇到,aspi接口验证和view页面的登录验证情况.asp.core 同样支持两种兼容. 首先在startup.cs 启用身份验证. var secrityKey = new Sy ...

  8. Jwt身份验证

    转载自博友(TerryTon)  1.因为json是通用的,所以jwt可以在绝大部分平台可以通用,如java,python,php,.net等  2.基于jwt是无状态的,jwt可以用于分布式等现在比 ...

  9. .NET CORE WebAPI JWT身份验证

    一.appsettings.Json文件配置 配置JWT公用参数. 1 /*JWT设置*/ 2 "JwtSetting": { 3 "Issuer": &quo ...

随机推荐

  1. 004 01 Android 零基础入门 01 Java基础语法 01 Java初识 04 Java程序的结构

    004 01 Android 零基础入门 01 Java基础语法 01 Java初识 04 Java程序的结构 Java程序的结构 Java程序外层--类 程序外层,如下面的代码,是一个类的定义. c ...

  2. [POI2010]PIL-Pilots 单调队列

    [POI2010]PIL-Pilots 题意: 给定一个序列和一个数值k,求一段连续最大区间是的最大值与最小值之差小于k: 思路: 因为要维护最大值和最小值并且连续,使用两个单调队列分别同时维护最大最 ...

  3. .NET 云原生架构师训练营(模块一 架构师与云原生)--学习笔记

    目录 什么是软件架构 软件架构的基本思路 单体向分布式演进.云原生.技术中台 1.1 什么是软件架构 1.1.1 什么是架构? Software architecture = {Elements, F ...

  4. fastadmin 增加批量操作字段 提示无权限

    是这样的找了权限节点的问题,始终找不到,后来 在社区传世人回答别人问题是提及到  $multiFields 就全局搜了下 在基类 Backend 里找到了这个.然后拿到 控制器中添加需要的参数 再次尝 ...

  5. golang 进行grpc调用

    参考https://blog.csdn.net/qq_32744005/article/details/105606383 go get google.golang.org/grpc go get - ...

  6. MeteoInfoLab脚本示例:中尺度气旋散点图

    全球长时间序列中尺度气旋数据(http://cioss.coas.oregonstate.edu/eddies/)有netCDF格式,散点数据类型,只有一个很大的维Nobs = 2590938.尝试读 ...

  7. 浅谈MircoPython---ESP8266

    一.连接WIFI 在Putty会话窗口输入 >>>help() 打印的消息会告诉你如何连接WIFI import network sta_if = network.WLAN(netw ...

  8. centos 开机启动服务 systemctl

    systemctl 实现开机自启服务 转载起一个好听的名字 最后发布于2018-06-26 13:49:06 阅读数 13473  收藏 展开 systemctl是RHEL 7 的服务管理工具中主要的 ...

  9. lerna管理前端模块实践

    最近在工作中使用了 lerna 进行前端包的管理,效率提升了很多.所以打算总结一下最近几个月使用 lerna 的一些心得.有那些不足的地方,请包涵. 该篇文章主要包括在使用 lerna 的一些注意事项 ...

  10. js实现无缝连接轮播图(二)实现自定义属性,根据banner图片的数量动态生成小圆点

    <!-- 这个animate.js 必须写到 index.js的上面引入 --><script src="js/animate.js"></scrip ...