如何在net.core 中使用 JWT(Json web token) 身份验证授权

在我们登录过程中或者是有一些功能我们是需要进行身份验证,不同的用户只能实现不同的功能

在这个过程中我们可以使用Token身份验证授权来解决

直接上代码:(以下代码都是core.5.0版本)

1引用包

 

需要注意的是版本要选对(我的core版本只跟新到5.0)

2.设计自己的实体类(这里只展示登录)

3.创建JWT帮助类

 1 using Microsoft.Extensions.Configuration;
 2 using Microsoft.IdentityModel.Tokens;
 3 using System;
 4 using System.Collections.Generic;
 5 using System.Security.Claims;
 6 using System.Text;
 7 using System.IdentityModel.Tokens.Jwt;
 8 
 9 namespace JwtAuthDemo.Helpers
10 {
11 public class JwtHelpers
12 {
13 private readonly IConfiguration Configuration;
14 
15 public JwtHelpers(IConfiguration configuration)
16 {
17 this.Configuration = configuration;
18 }
19 public string GenerateToken(string userName, int expireMinutes = 30)
20 {
21 var issuer = Configuration.GetValue<string>("JwtSettings:Issuer");
22 var signKey = Configuration.GetValue<string>("JwtSettings:SignKey");
23 //添加claims
24 var claims = new List<Claim>();
25 //在 RFC 中 一共有七种claims 我们现在用的只有以下两种
26 claims.Add(new Claim(JwtRegisteredClaimNames.Sub, userName)); // User.Identity.Name
27 claims.Add(new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())); // JWT ID
28 //你自己需要登录的用户名
29 claims.Add(new Claim("roles", "Admin"));
30 claims.Add(new Claim("roles", "Users"));
31 var userClaimsIdentity = new ClaimsIdentity(claims);
32 
33 // 建立密钥
34 var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(signKey));
35 
36 
37 var signingCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256Signature);
38 
39 // 建立 SecurityTokenDescriptor
40 var tokenDescriptor = new SecurityTokenDescriptor
41 {
42 Issuer = issuer,
43 
44 Subject = userClaimsIdentity,
45 Expires = DateTime.Now.AddMinutes(expireMinutes),
46 SigningCredentials = signingCredentials
47 };
48 
49 //获取序列化的Token
50 var tokenHandler = new JwtSecurityTokenHandler();
51 var securityToken = tokenHandler.CreateToken(tokenDescriptor);
52 var serializeToken = tokenHandler.WriteToken(securityToken);
53 
54 return serializeToken;
55 }
56 }
57 }

 

 

4.设置Issuer以及SignKey

 

 

 添加

 

 

 

 

 

 

 5.添加连接接口

在 Startup 中添加接口

services.AddSingleton<JwtHelpers>();

6配置Swagger认证

 1 #region 开启Swagger认证
 2                 c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()
 3                 {
 4 
 5                     Description = "在下框中输入请求头中需要添加Jwt授权Token:Bearer Token",
 6                     Name = "Authorization",
 7                     In = ParameterLocation.Header,
 8                     Type = SecuritySchemeType.ApiKey,
 9                     BearerFormat = "JWT",
10                     Scheme = "Bearer"
11                 });
12 
13                 c.AddSecurityRequirement(new OpenApiSecurityRequirement
14                 {
15                     {
16                         new OpenApiSecurityScheme
17                         {
18                             Reference = new OpenApiReference {
19                                 Type = ReferenceType.SecurityScheme,
20                                 Id = "Bearer"
21                             }
22                         },
23                         new string[] { }
24                     }
25                 });
26                 #endregion

添加位置为

 

 最后一步就可以通过控制器进行调试使用了

 1 using JwtAuthDemo.Helpers;
 2 using Microsoft.AspNetCore.Authorization;
 3 using Microsoft.AspNetCore.Http;
 4 using Microsoft.AspNetCore.Mvc;
 5 using System;
 6 using System.Collections.Generic;
 7 using System.Linq;
 8 using System.Threading.Tasks;
 9 using Jwt.Model;
10 namespace Jwt.Controllers
11 {
12     [Authorize]
13     [Route("api/[controller]")]
14     [ApiController]
15     public class LoginController : ControllerBase
16     {
17         private readonly JwtHelpers _helpers;
18         public LoginController(JwtHelpers helpers)
19         {
20             _helpers = helpers;
21         }
22         //任何请求都可以访问该方法
23         [AllowAnonymous]
24         [HttpPost,Route("login")]
25         public IActionResult Login(loginModel login)
26         {
27             if(ValidateUser(login))
28             {
29                 var token = _helpers.GenerateToken(login.UserName);
30                 HttpContext.Response.Headers.Add("token", token);
31                 return Ok();
32             }
33             else
34             {
35                 //失败的请求
36                 return BadRequest();
37             }
38         }
39         [Authorize]
40         [HttpGet]
41         public bool ValidateUser(loginModel login)//测试代码
42         {
43             return true;
44         }
45         [Authorize]
46         [HttpGet,Route("Test")]
47         public IActionResult Test()
48         {
49             return Ok("Test");
50         }
51     }
52 }

使用原理为获取Token码 进行验证

 

 不用Token登录会显示401

 

 进入Swgger验证

 

Bearer + Token验证码

 

 

 可以设置多个Token码 进行不同用户使用;

 

posted @ 2021-11-09 15:21  Net彪子  阅读(496)  评论(0)    收藏  举报