.Net6使用JWT认证和授权

news2024/12/28 18:22:42

文章目录

  • 目的
  • 实现案例
    • 一.项目所需包:
    • 二.配置项目 appsettings.json 文件:
    • 三.创建Model文件夹,添加AppConfig类和UserRole类
      • 1.AppConfig类获取appsettings.json文件中的值
      • 2.UserRole类用于区分用户信息和权限
    • 四.主体代码案例:
      • 1.LoginController 控制器,实现用户登录,JWT授权
      • 2.HomeController 控制器,无需登录,游客模式也能访问
      • 3.UserRoleController 控制器,用户登录之后可以访问
      • 4.AdminController 控制器,管理员权限登录之后可以访问
      • 5.在Program中注册JWT,swagge添加Jwt入口
    • 五.项目运行
      • 1.游客模式:
      • 2.普通用户模式:
      • 3.接着使用管理员账户登录,访问admin/hello
  • 结果


目的

.Net6使用JWT实现登录认证和授权
接口分三种类型:
1.游客模式:没有登录也可以访问的接口
2.用户模式:普通用户登录,可以访问的接口(登录即可访问)
3.管理模式:鉴定Token权限,拥有管理员资格的用户,才能访问

https://gitee.com/hgcjd/JWTDemoTest.git


实现案例

一.项目所需包:

在这里插入图片描述


二.配置项目 appsettings.json 文件:

配置jwt所需信息
在这里插入图片描述

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "JwtTokenOptions": {
    "Issuer": "http://xxxx.com",
    "Audience": "http://xxxx.com",
    "SecurityKey": "qwertyuiopasdfghjklzxcvbnm1234567890"
  }
}

三.创建Model文件夹,添加AppConfig类和UserRole类

1.AppConfig类获取appsettings.json文件中的值

/// <summary>
/// 获取.NetCore配置文件信息
/// </summary>
public class AppConfig
{
    public static string GetConfigInfo(string Key)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json");

        IConfigurationRoot configuration = builder.Build();
        string configStr = configuration.GetSection($"{Key}").Value;
        if (!string.IsNullOrWhiteSpace(configStr))
        {
            return configStr;
        }
        return null;
    }

}

2.UserRole类用于区分用户信息和权限

/// <summary>
/// 用户,权限
/// </summary>
public class UserRole
{
    //权限
    public int Role { get; set; }

    /// <summary>
    /// 用户名
    /// </summary>
    public string UserId { get; set; }

    /// <summary>
    /// 密码
    /// </summary>
    public string Password { get; set; }
}

四.主体代码案例:

1.LoginController 控制器,实现用户登录,JWT授权

[Route("login")]
[ApiController]
public class LoginController : ControllerBase
{

    /// <summary>
    /// 用户列表
    /// </summary>
    private readonly static List<UserRole> _Users = new List<UserRole>()
    {
        new UserRole{ Role = 1,UserId = "administrator",Password = "123456" },   //管理员
        new UserRole{ Role = 0,UserId = "user",Password = "1"}   //普通用户
    };

    /// <summary>
    /// 管理权限配置
    /// </summary>
    private readonly static List<Claim> _administrator = new List<Claim>() {
         new Claim(ClaimTypes.Name,"administrator"),
         new Claim(ClaimTypes.Role,"administrator"),
         new Claim(ClaimTypes.Role,"user"),
    };

    /// <summary>
    /// 普通用户权限配置
    /// </summary>
    private readonly static List<Claim> _user = new List<Claim>() {
         new Claim(ClaimTypes.Name,"user"),
         new Claim(ClaimTypes.Role,"user"),
    };

    /// <summary>
    /// 用户登录接口
    /// </summary>
    /// <param name="userid"></param>
    /// <param name="password"></param>
    /// <returns></returns>
    [Route("login")]
    [HttpPost]
    public string Login(string userid,string password)
    {
        if (!string.IsNullOrWhiteSpace(userid) && !string.IsNullOrWhiteSpace(password))
        {
            var list = _Users.Where(e => e.UserId.ToString() == userid && e.Password == password).ToList();
            if (list != null && list.Count > 0)
            {
                var userInfo = list[0];
                var claims = new List<Claim>();
                if (userInfo.Role == 1)
                    claims = _administrator;//管理权限
                else
                    claims = _user;//普通用户

                JwtSecurityToken token = new JwtSecurityToken(
                        issuer:AppConfig.GetConfigInfo("JwtTokenOptions:Issuer"),
                        audience: AppConfig.GetConfigInfo("JwtTokenOptions:Audience"),
                        claims: claims,
                        expires: DateTime.Now.AddMinutes(5),
                        signingCredentials: new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(AppConfig.GetConfigInfo("JwtTokenOptions:SecurityKey"))), SecurityAlgorithms.HmacSha256)
                    ); 
                string tokenStr = new JwtSecurityTokenHandler().WriteToken(token);
                return tokenStr;
            }
        }
        return null;
    }
}

2.HomeController 控制器,无需登录,游客模式也能访问

/// <summary>
/// 公共接口,游客也可以访问
/// </summary>
[Route("Home")]
[ApiController]
public class HomeController : ControllerBase
{
    [Route("Hello")]
    [HttpGet]
    public async Task<string> HelloAction()
    {
        return "Hello People~";
    }
}

3.UserRoleController 控制器,用户登录之后可以访问

通过 [Authorize]属性实现,该属性也可以放在单个接口上,使单个接口需要权限认证

/// <summary>
/// 登录后,用户权限是User的才能访问
/// </summary>
[Route("UserRole")]
[ApiController]
//[Authorize(Roles ="user")]
[Authorize]
public class UserRoleController : ControllerBase
{
    [Route("Hello")]
    [HttpGet]
    public async Task<string> HelloUser()
    {
        return "Hello User~";
    }
}

4.AdminController 控制器,管理员权限登录之后可以访问

通过 [Authorize(Roles = “administrator”)]实现,Roles 标注需要的权限类型,该属性也可以放在接口上

/// <summary>
/// 管理员登录,才能访问
/// </summary>
[Route("AdminRole")]
[ApiController]
[Authorize(Roles = "administrator")]
public class AdminController : ControllerBase
{
    [Route("Hello")]
    [HttpGet]
    public async Task<string> HelloAdmin()
    {
        return "Hello Administrator~";
    }
}

5.在Program中注册JWT,swagge添加Jwt入口

using JwtDemoTest.Model;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using System.Text;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

#region 注册Jwt认证
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer("Bearer", o =>
{
    o.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuerSigningKey = true,//是否验证签名,不验证的画可以篡改数据,不安全
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(AppConfig.GetConfigInfo("JwtTokenOptions:SecurityKey"))),//解密的密钥
        ValidateIssuer = true,//是否验证发行人,就是验证载荷中的Iss是否对应ValidIssuer参数
        ValidIssuer = AppConfig.GetConfigInfo("JwtTokenOptions:Issuer"),//发行人,
        ValidateAudience = true,//是否验证订阅人,就是验证载荷中的Aud是否对应ValidAudience参数
        ValidAudience = AppConfig.GetConfigInfo("JwtTokenOptions:Audience")//订阅人       
    };
});
builder.Services.AddAuthorization();
#endregion

#region swagge添加Jwt认证
builder.Services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "My WebApi JwtDemoTest", Version = "v1" });

    // 定义安全定义
    c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
    {
        Description = "JWT Authorization header using the Bearer scheme",
        Name = "Authorization",
        In = ParameterLocation.Header,
        Type = SecuritySchemeType.ApiKey,
        Scheme = "Bearer"
    });

    // 添加认证要求
    c.AddSecurityRequirement(new OpenApiSecurityRequirement
    {
        {
            new OpenApiSecurityScheme
            {
                Reference = new OpenApiReference
                {
                    Type = ReferenceType.SecurityScheme,
                    Id = "Bearer"
                }
            },
            Array.Empty<string>()
        }
    });
});
#endregion


var app = builder.Build();

app.UseAuthentication();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseAuthorization();

app.MapControllers();

app.Run();

五.项目运行

1.游客模式:

项目未登录,也可访问Home/Hello接口
在这里插入图片描述

2.普通用户模式:

普通用户登录获取Token,然后调用接口访问成功
首先调用login/login接口,获取普通用户权限token
在这里插入图片描述
接口携带token
在这里插入图片描述
携带普通用户登录后的token之后,访问 userrole/hello 接口成功
在这里插入图片描述

3.接着使用管理员账户登录,访问admin/hello

在这里插入图片描述

结果

.Net6 JWT搭建认证,授权,鉴权成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1498338.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Javaweb之Web后端开发总结的详细解析

4. Web后端开发总结 到此基于SpringBoot进行web后端开发的相关知识我们已经学习完毕了。下面我们一起针对这段web课程做一个总结。 我们来回顾一下关于web后端开发&#xff0c;我们都学习了哪些内容&#xff0c;以及每一块知识&#xff0c;具体是属于哪个框架的。 web后端开…

想用Python做自动化测试?Python反射机制的应用!

通常&#xff0c;我们操作对象的属性或者方法时&#xff0c;是通过点“.”操作符进行的。例如下面的代码&#xff1a; class Person: type "mammal"def __init__(self, name): self.name namedef say_hi(self): print(Hello, my name is, self.n…

vue页面刷新问题:返回之前打开的页面,走了create方法(解决)

vue页面刷新问题&#xff1a;返回之前打开的页面&#xff0c;走了create方法&#xff08;解决&#xff09; 直接上图&#xff0c; 我们在开发的时候经常会复制粘贴&#xff0c;导致vue文件的name没有及时修改 我们需要保证name和浏览器的地址一致&#xff0c;这样才能实现缓…

面试题个人总结(面经)

自我介绍 你好&#xff0c;我叫XXX&#xff0c;是今天面试初级蓝队的人员&#xff0c;我毕业于XXXX&#xff0c;专业为网络空间安全,我曾经在XXXXX实习过&#xff0c;有过大概一年左右的工作经验&#xff0c;还有过一定的护网经验&#xff0c;去年在XXX厂商护过网&#xff0c;…

大型网站架构演化总结

本文图解大型网站架构演化。 目录 1、单一应用服务阶段 2、应用与数据服务分离阶段 3、利用缓存提高性能阶段 4、应用服务集群阶段 5、数据库读写分离阶段 6、反向代理与CDN加速阶段 7、分布式数据库阶段 8、 NoSQL与搜索引擎阶段 9、业务拆分阶段 10、分布式服务阶…

电脑要用多少V的电源?电脑电源输入电压是市电

台式电源的输出电压是多少&#xff1f; 电脑电源输出一般有三种不同的电压&#xff0c;分别是&#xff1a; 12V、5V、3.3V。 电脑电源负责给电脑配件供电&#xff0c;如CPU、主板、内存条、硬盘、显卡等&#xff0c;是电脑的重要组成部分。 工作电流根据不同的硬件及其使用状…

从仓储管理看3C电子行业智慧物流的优势

仓储管理是智慧物流的重要组成部分。通过引入自动化、智能化的仓储管理系统&#xff0c;3C电子企业可以实现库存的精准管理、快速分拣和高效配送。这不仅减少了库存成本&#xff0c;还大大提高了运营效率和市场响应速度。 传统的仓储管理依赖于人工操作和纸质文档记录&#xff…

Java项目:37 springboot003图书个性化推荐系统的设计与实现

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 springboot003图书个性化推荐系统的设计与实现 管理员&#xff1a;首页、个人中心、学生管理、图书分类管理、图书信息管理、图书预约管理、退换图书…

unity学习(50)——服务器三次注册限制以及数据库化角色信息5--角色信息数据库化收尾

上一节内容结束后确实可以写入文件了&#xff0c;但还有两个问题&#xff1a; 1.一个是players.txt中&#xff0c;每次重启服务器&#xff0c;当注册新账号创建角色时&#xff0c;players.txt之前内容都会清空。 2.players.txt之前已经注册3次的账号&#xff0c;新注册的角色…

做接口测试的流程一般是怎么样的?2024全网最全教程(建议收藏)

在讲接口流程测试之前&#xff0c;首先需要给大家申明下&#xff1a;接口测试对于测试人员而言&#xff0c;非常非常重要&#xff0c;懂功能测试接口测试&#xff0c;就能在企业中拿到一份非常不错的薪资。不信请狠狠点击下方链接&#xff08;下方链接也有接口学习方法及学习资…

Vue中的v-for中为什么不推荐使用index作为key值

在Vue中&#xff0c;我们经常会用到v-for指令来遍历数组或对象并渲染列表。而在使用v-for指令时&#xff0c;通常会需要给每个遍历的元素指定一个唯一的key值&#xff0c;以帮助Vue更高效地更新DOM。 在很多情况下&#xff0c;我们可能会倾向于使用index作为key值&#xff0c;…

Qt程序设计-柱状温度计自定义控件实例

Qt程序设计-柱状温度计自定义控件实例 本文讲解Qt柱状温度计自定义控件实例。 效果演示 创建温度计类 #ifndef THERMOMETER_H #define THERMOMETER_H#include <QWidget> #include <QPainter> #include <QDebug> #include <QTimer> #include <QPr…

Unity之街机捕鱼

目录 &#x1f62a;炮台系统 &#x1f3b6;炮口方向跟随鼠标 &#x1f3b6;切换炮台 &#x1f62a;战斗系统 &#x1f3ae;概述 &#x1f3ae;单例模式 &#x1f3ae;开炮 &#x1f3ae;子弹脚本 &#x1f3ae;渔网脚本 &#x1f3ae;鱼属性信息的脚本 &#x1f6…

HTML5:七天学会基础动画网页9

在进行接下来的了解之前我们先来看一下3d的xyz轴&#xff0c;下面图中中间的平面就相当于电脑屏幕&#xff0c;z轴上是一个近大远小的效果。 3d转换属性 transform 2D或3D转换 transform-origin 改变旋转点位置 transform-style 嵌套元素在3D空间如何显 …

文件二维码怎么加访问权限?加密、限时、限次的二维码制作技巧

扫码查看或者下载文件已经是现在经常被使用的一种方式&#xff0c;当我们通过这种方式来展现文件内容时&#xff0c;是否能够加入一些权限设置来保障文件的安全性&#xff0c;是很多小伙伴非常关心的一个问题。 想要制作文件二维码&#xff0c;大多情况下会通过在线二维码生成…

GPQA数据集分享

来源: AINLPer公众号&#xff08;每日干货分享&#xff01;&#xff01;&#xff09; 编辑: ShuYini 校稿: ShuYini 时间: 2024-2-28 尽管AI系统在许多任务上表现出色&#xff0c;但在需要大量专业知识和推理能力的任务上仍然存在局限性。为此&#xff0c;纽约大学的研究者提出…

Yii2中如何使用scenario场景,使rules按不同运用进行字段验证

Yii2中如何使用scenario场景&#xff0c;使rules按不同运用进行字段验证 当创建news新闻form表单时&#xff1a; 添加新闻的时候执行create动作。 必填字段&#xff1a;title-标题&#xff0c;picture-图片&#xff0c;description-描述。 这时候在model里News.php下rules规则…

智慧城市中的数据力量:大数据与AI的应用

目录 一、引言 二、大数据与AI技术的融合 三、大数据与AI在智慧城市中的应用 1、智慧交通 2、智慧环保 3、智慧公共安全 4、智慧公共服务 四、大数据与AI在智慧城市中的价值 1、提高城市管理的效率和水平 2、优化城市资源的配置和利用 3、提升市民的生活质量和幸福感…

【人工智能课程】计算机科学博士作业三

【人工智能课程】计算机科学博士作业三 来源&#xff1a;李宏毅2022课程第10课的作业 1 图片攻击概念 图片攻击是指故意对数字图像进行修改&#xff0c;以使机器学习模型产生错误的输出或者产生预期之外的结果。这种攻击是通过将微小的、通常对人类难以察觉的扰动应用于输入…

1.5 简述转置卷积的主要思想以及应用场景

1.5 简述转置卷积的主要思想以及应用场景 普通的卷积主要思想&#xff1a; 普通的卷积操作可以形式化为一个矩阵乘法运算&#xff0c;即yAx&#xff08;1-12&#xff09; 其中&#xff0c;x和y分别是卷积的输入和输出(展平成一维向量形式)&#xff0c;维度分别为d⁽i⁾和d⁽…