.net6 基本使用JWT生成Token,模拟用户登录,启动api授权,需要登录携带token才能请求数据,基本给用户添加权限管理

2023-05-16

1. 创建好项目,添加一个控制器,新建用户登录api接口和接收用户登录信息类Dto

在这里插入图片描述
Dto就包含两个字段,账号和密码
在这里插入图片描述

2. 安装NuGet包,搜索JWT,安装图下这个包

在这里插入图片描述

3. 在appsettings.json添加JWT加密需要的私钥,发布者等相关配置信息,私钥用户可以自定义。

私钥:SecretKey
发布者:Issuer
接收者:Audience

"Authentication": {
    "SecretKey": "nadjhfgkadshgoihfkajhkjdhsfaidkuahfhdksjaghidshyaukfhdjks",
    "Issuer": "www.adsfsadfasdf",
    "Audience": "www.adsfsadfasdf"
  }

在这里插入图片描述

4. 生成JWT,存放用户信息,上篇文章我们基本认识解析了JWT,JWT分为三部分:
  • 标头(Header):有令牌的类型和所使用的签名算法,如HMAC、SHA256、RSA,用于加密Signature,使用Base64编码组成。
  • 有效载荷(Payload):存放用户信息,用户id,权限等,不不放用户敏感的信息,如密码,使用Base64编码组成。
  • 签名(Signature):使用编码后的header和payload
    加上我们提供的一个密钥,使用header中指定的签名算法(HS256)进行签名加密。
using JWTDemo.Dtos;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;

namespace JWTDemo.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class AuthenticationController : ControllerBase
    {
        public readonly IConfiguration _configuration;
        public AuthenticationController(IConfiguration configuration)
        {
            _configuration=configuration;
        }
        [HttpPost("login")]
        public IActionResult Login([FromBody] LoginDto loginDto)
        {
            //1.验证用户账号密码是否正确,暂时忽略,因为我们是模拟登录

            //2.生成JWT
            //Header,选择签名算法
            var signingAlogorithm = SecurityAlgorithms.HmacSha256;
            //Payload,存放用户信息,下面我们放了一个用户id
            var claims = new []
            {
                new Claim(JwtRegisteredClaimNames.Sub,"user_id")
            };
            //Signature
            //取出私钥并以utf8编码字节输出
            var secretByte = Encoding.UTF8.GetBytes(_configuration["Authentication:SecretKey"]);
            //使用非对称算法对私钥进行加密
            var signingKey = new SymmetricSecurityKey(secretByte);
            //使用HmacSha256来验证加密后的私钥生成数字签名
            var signingCredentials=new SigningCredentials(signingKey, signingAlogorithm);
            //生成Token
            var Token=new JwtSecurityToken(
                    issuer: _configuration["Authentication:Issuer"],        //发布者
                    audience: _configuration["Authentication:Audience"],    //接收者
                    claims: claims,                                         //存放的用户信息
                    notBefore: DateTime.UtcNow,                             //发布时间
                    expires:DateTime.UtcNow.AddDays(1),                      //有效期设置为1天
                    signingCredentials                                      //数字签名
                );
            //生成字符串token
            var TokenStr=new JwtSecurityTokenHandler().WriteToken(Token);
            return Ok(TokenStr);
        }
    }
}

取出用户信息用

//“user_id”键名
var id = HttpContext.User.Claims.First(c => c.Type == "user_id");
5. 启动项目,测试接口,生成token成功

在这里插入图片描述

6. 在Program.cs注入JWT身份认证服务,下面代码均有注释
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        //取出私钥
        var secretByte = Encoding.UTF8.GetBytes(builder.Configuration["Authentication:SecretKey"]);
        options.TokenValidationParameters = new TokenValidationParameters()
        {
            //验证发布者
            ValidateIssuer = true,
            ValidIssuer = builder.Configuration["Authentication:Issuer"],
            //验证接收者
            ValidateAudience = true,
            ValidAudience = builder.Configuration["Authentication:Audience"],
            //验证是否过期
            ValidateLifetime = true,
            //验证私钥
            IssuerSigningKey = new SymmetricSecurityKey(secretByte)
        };
    });

在这里插入图片描述

//添加jwt验证
app.UseAuthentication();
app.UseAuthorization();

在这里插入图片描述

7. 给api加上授权保护,新建一个测试api,在api上面添加[Authorize]
 [HttpGet("test")]
 [Authorize]
 public IActionResult test()
 {
 	return Ok("test");
}
8.测试接口

没登陆获取到Token,直接请求失败,返回401
在这里插入图片描述
登录一下获取到token加到Headers上注意bearer后面有个空格分开,才加上token:

KEY:Authorization
VALUE:bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyX2lkIiwibmJmIjoxNjQ5MzQ0MDY0LCJleHAiOjE2NDk0MzA0NjQsImlzcyI6Ind3dy5hZHNmc2FkZmFzZGYiLCJhdWQiOiJ3d3cuYWRzZnNhZGZhc2RmIn0.-yNVFtme3LzmAJFCcBSjN-DX7w_dZSpmGdrHlo7bXxc

请求成功:
在这里插入图片描述

9.登录成功后给用户添加权限

在之前登录生成JWT的api方法里,我们在JWT的Payload给用户添加一个权限名称信息,new Claim(ClaimTypes.Role,“admin”)
在这里插入图片描述

10.给api接口添加权限

[Authorize(Roles =“admin”)],权限为admin用户才能访问

        [HttpGet("test")]
        [Authorize(Roles ="admin")]
        public IActionResult test()
        {
            return Ok("test");
        }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.net6 基本使用JWT生成Token,模拟用户登录,启动api授权,需要登录携带token才能请求数据,基本给用户添加权限管理 的相关文章

  • ZED2相机标定及运行VINS-mono

    一 ZED2相机 43 IMU标定 1 标定工具安装 Kalibr的安装参见我的另外一篇博客Kalibr安装及相机 43 IMU标定 xff08 需要注意的是Kalibr的安装需要网络能用google 否则网络问题会导致安装不成功 xff0
  • Realsense L515初次使用记录

    1 realsense驱动安装及ros下驱动的安装 xff0c 参考网上资料 xff0c 非常之多 xff0c 和D435i驱动安装一样 2 打开realsense L515相机 realsense viewer 可以看到如下效果 xff1
  • RealSense T265相机使用及运行ORB-SLAM3

    1 驱动安装 同realsense D435i xff0c 不做介绍 2 运行realsense viewer查看效果 3 修改rs t265 launch文件 xff0c 查看运行效果 xff0c 作如下修改 xff1a lt arg n
  • 解决办法_打开realsense D435i报错:terminate called after throwing an instance of ‘rs2::invalid_value_error‘

    很长时间没有使用笔记本打开realsense D435i相机 xff0c 再次使用时发现不灵了 xff0c 报错如下 xff1a INFO 1633692792 103425171 Setting Dynamic reconfig para
  • Qt:解析xml文件

    XML 什么事XML文件 XML xff0c 可扩展标记语言 xff08 Extensible Markup Language xff09 xff0c 是一种标记语言 一般用 于数据存储 配置文件存储 xff0c xff08 Qt的ui文件
  • 机器学习实战项目汇总

    ML assignments about Regression Classification CNN RNN Explainable AI Adversarial Attack Network Compression Seq2Seq GAN
  • C++类的运算符重载

    11 8 类的运算符重载 运算符重载是一种形式的C 43 43 多态 运算符重载将充值该的概念扩展到运算符上 xff0c 允许赋予C 43 43 运算符多种含义 C 43 43 允许将运算符重载扩展到用户定义类型 xff0c 例如 xff0
  • qgc通过mavros连接到Pixhawk飞控

    qgc通过mavros连接到Pixhawk飞控 mavros设置QGC设置 mavros确实是一个不错的工具 xff0c 在机载电脑上进行无人机开发的时候 xff0c 有时候想调飞控的参数看一下飞控的一些信息 xff0c 但是直接接飞控又不
  • 【视觉 SLAM】2D-2D:对极几何

    本文为视觉 SLAM 学习总结 xff0c 讲解 2D 2D 对极几何 欢迎交流 理论 现在相机得到了两张图片 xff08 通常为初始帧和第二帧 xff09 xff0c 已知两张图片中的像素坐标点和特征点的匹配关系 xff0c 已知相机内参
  • C调用python生成的so动态库

    目标 python代码实现的功能 xff0c 转成so动态链接库库 xff0c 然后被C语言调用 环境 ubuntu 18 04 思路 写一个pyx xff0c 用Cython生成so xff0c 写一个main c调用so 过程记录 写
  • 树莓派连接电源时,红灯常亮,绿灯连续闪两下后一直灭的问题

    可能原因 xff1a 1 解压途径不正确 IMG不能用RAR软件解压 xff0c 要用7ZIP xff08 官网有 xff1a 7ZIP xff09 用7ZIP解压 xff0c 然后重新刷系统 2 可能是SPI EEPROM的问题 xff0
  • 树莓派不能上网的可能原因以及解决方法

    不能上网的具体表现为树莓派的Web浏览器不能进入百度 xff0c 且运行sudo apt get update指令会报错 xff0c 提示 暂时不能解析域名 在百度上尝试了很多办法 xff0c 比如在 etc resolv conf文件中修
  • 树莓派4B学习笔记(3)—— 原理图与设置界面

    一 树莓派4B介绍 戳这里获取原理图 目前树莓派4只支持 xff0c 2019年7月10日发布的新系统raspbian buster xff0c 有精简版和全功能版 对于之前任何能与树莓派3兼容的系统 xff0c 树莓派4一概不支持 树莓派
  • 机器人正运动学(2)—— 自由度

    目录 1 自由度的定义2 自由度的计算2 1 刚体的自由度2 2 运动副2 3 自由度算例 3 总结 1 自由度的定义 自由度在很多领域中会出现 xff0c 对于机器人而言 xff0c 我们这里谈的也就是机构的自由度 任何一台机器人都可以认
  • 机器人正运动学(8)—— DH坐标系建立技巧

    目录 1 引言2 建立DH坐标系的技巧2 1 理清关节和连杆2 2 画 z 轴2 3 确定 x 轴2 3 1 x轴方向2 3 2 x轴起始点 xff08 坐标系原点 xff09 2 4 小结 3 总结 1 引言 关于DH参数上一篇文章介绍了
  • ROS 学习笔记(13)—— 常用可视化工具的使用

    常用可视化工具的使用 1 QT 工具箱1 1 日志输出工具 rqt console1 2 数据绘图工具 rqt plot1 3 图像渲染工具 rqt image view1 4 计算图可视化工具 rqt graph1 5 综合工具 rqt
  • 树莓派4B安装 ubuntu20.04 & VNC远程桌面 & 安装ROS noetic

    树莓派4B安装 ubuntu20 04 amp VNC远程桌面 amp 安装ROS noetic 1 安装ubuntu方式1 xff1a 下载Imager文件 方式2 xff1a 下载镜像文件 2 查询树莓派 IP 地址3 使用ssh远程登
  • ROS踩坑记录

    ROS踩坑记录 问题 xff1a ubuntu 没有 dev ttyUSB0问题 xff1a 运行 launch 文件或 ROS 节点时出现 exit code 9 错误提示问题 xff1a windows使用vscode远程连接 xff0
  • ROS中的分布式通讯(树莓派与虚拟机)

    ROS中的分布式通讯 xff08 树莓派与虚拟机 xff09 一 前言二 树莓派连接WIFI三 查找局域网下的其他设备 IP四 确定可以ping通五 配置文件修改六 配置主机 IP七 配置从机 IP八 测试九 可能会遇到的问题 一 前言 在
  • Laravel Passport-不支持授予类型("error": "unsupported_grant_type")

    如果你在Laravel里使用Passport授权验证的时候出现 xff1a span class token punctuation span span class token double quoted string string 34

随机推荐