• .Net Core WepApi(4)-JWT认证


    JWT 介绍
    JWT(Json Web Token)是一种开放标准,已Json对象的方式在各方之间安全地传输信息
    JWT登陆状态不在服务器端进行存储,而是通过秘钥生成一个具有有效时间的Token返回给前端,Token中包含类似用户的Id等信息 ,之后的请求将Token携带到服务器端认证,认证通过后可解析Token拿到用户标识进行后续操作
     
    JWT官网地址: https://jwt.io
     
    JWT结构:(格式: aaaaaa.bbbb.cccc)
    (1)Header
    (2)Payload 载荷,存放需要传递的数据(用户信息和认证信息等)
    1 JWT 规定了7个官方字段,供选用。
    2 1 iss (issuer):签发人
    3 2 exp (expiration time):过期时间
    4 3 sub (subject):主题
    5 4 aud (audience):受众
    6 5 nbf (Not Before):生效时间
    7 6 iat (Issued At):签发时间
    8 7 jti (JWT ID):编号
    (3)Signature 签名(防止数据被篡改)
    使用编码后(base64编码)的header和payload再加上我们提供的一个公钥,然后使用header中指定的签名算法进行签名。
    作用是保证JWT没有被窜改过
     
    JWT使用
    引用:Microsoft.AspNetCore.Authentication.JwtBearer
    1.在“appsettings.json”中配置信息存储:
    1 "JwtSettings": {
    2     "Issuer": "admin",
    3     "Audience": "user",
    4     "SecretKey": "dadf4t5gfg6hh6h6h"
    5   }
     
    2.通过依赖注入,将配置文件注入到我们的类对象中
    创建类“JwtSettings
    1 public class JwtSettings
    2     {
    3         public string Issuer { get; set; }
    4         public string Audience { get; set; }
    5         public string SecretKey { get; set; }
    6     }

    在Startup.cs中注入:

    1 //ConfigureServices
    2 services.Configure<JwtSettings>(Configuration.GetSection("JwtSettings"));
    3 JwtSettings setting = new JwtSettings();
    4 Configuration.Bind("JwtSettings", setting);
    5 JwtHelper.Settings = setting;
    6 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    7 
    8 //Configure
    9 app.UseAuthentication();
     
    3.创建JwtHelper.cs生成token
     1 public class JwtHelper
     2     {
     3         private static JwtSettings settings;
     4         public static JwtSettings Settings { set { settings = value; } }
     5         public static string create_Token()
     6         {
     7             var claims = new Claim[] {
     8                                     new Claim(ClaimTypes.Name, "zhangsan"),
     9                                     new Claim(ClaimTypes.Role, "admin"),
    10                                     new Claim(ClaimTypes.Sid,"wmcodetypeid")
    11                                                         };
    12             var key = new  SymmetricSecurityKey(Encoding.UTF8.GetBytes(settings.SecretKey));
    13             var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
    14             var token = new JwtSecurityToken(
    15                             issuer: settings.Issuer,
    16                             audience: settings.Audience,
    17                             claims: claims,
    18                             expires: DateTime.Now.AddDays(1),
    19                             signingCredentials: creds);
    20             var Token = new JwtSecurityTokenHandler().WriteToken(token);
    21             return Token;
    22         }
    23     }

    测试认证:

    [HttpPost]
    [Authorize]
    public string GetOnlineCallerList()
    {
        TableData data = new TableData();
        data = _service.GetOnlineCallerList();
        return JsonHelper.Instance.Serialize(data);
    }

    未在表头添加token认证,状态401

     在表头添加token认证,状态200,返回成功。

  • 相关阅读:
    2018年3月至4月小结
    前端面试中,经常看到垂直居中与水平居中,实际排版用的多吗?
    Hbuilder配置识别逍遥安卓模拟器
    php静态变量与方法与phar的使用
    切面反射获取方法
    Spring:源码解读Spring IOC原理
    怎样批量提取JPG照片的文件名
    如何1秒批量提取电脑文件夹中的所有文件、文件夹名字到txt/excel
    用powermock 方法中new对象
    springboot单元测试自动回滚:@Transactional
  • 原文地址:https://www.cnblogs.com/ywkcode/p/11909019.html
Copyright © 2020-2023  润新知