.Net6使用JWT认证和授权

文章目录

  • 目的
  • 实现案例
    • 一.项目所需包:
    • 二.配置项目 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;//管理权限elseclaims = _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>()}});
});
#endregionvar 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.rhkb.cn/news/270940.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kasan排查kernel内存越界示例(linux5.18.11)

参考资料&#xff1a; 1&#xff0c;内核源码目录中的Documentation\dev-tools\kasan.rst 2&#xff0c;KASAN - Kernel Address Sanitizer | Naveen Naidu (naveenaidu.dev) 一、kasan实现原理 KASAN&#xff08;Kernel Address SANitizer&#xff09;是一个动态内存非法访…

C#与python交互(flask发送Get/Post请求)

先运行python&#xff0c;再运行C# **ps: 注意修改端口号**python发送Get/Post请求 # -*- coding: utf-8 -*- # Time : 2024/1/25 15:52 # Author : YY # File : post_test.py # Content&#xff1a;提交数据给客户端 from flask import Flask, request, jsonify, redirect…

使用Kali搭建钓鱼网站教程

一、前言 使用kali工具一分钟制作出和目标网站一模一样的钓鱼网站。目标用户使用钓鱼网站登录自己的账号&#xff0c;账号密码将被自动劫持。 二、钓鱼网站的制作过程 1.在虚拟机VMvare中登录kali linux 2.准备一个目标网址 3.在kail中搜索使用工具 4.在弹出的选项中选择第一…

C++初阶:初识C++

目录 1. 前言&#xff1a;C 与 C语言2. C对于C语言语法的完善与补充2.1 命名冲突与命名空间2.1.1 命名空间的定义2.1.2 调用方式 2.3 补充&#xff1a;流的概念2.4 缺省参数2.4.1 缺省参数的使用 2.5 函数重载2.5.1 什么是函数重载2.5.2 函数重载的使用2.5.3 特殊情况&#xff…

Docker基础教程 - 1 Docker简介

更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 1 Docker简介 Docker是一个强大的容器化平台&#xff0c;让你能够更轻松地构建、部署和运行应用程序。 下面我们来学习 Docker。 1.1 Docker是什么 1 现在遇到的问题 每次部署一台服务器&…

OpenAI 大声朗读出来

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Kubernetes-3

Kubernetes学习第3天 Kubernetes-31、查看实时的cpu和内存消耗1.1、kubectl top node 2、卷的使用2.1、什么是卷&#xff1f;1. 解决数据持久性问题2. Kubernetes 中的卷抽象概念3. 共享数据示例4. Kubernetes 中的卷使用5. 不同类型的卷6. 灵活、可靠的数据管理 2.2、联想到do…

[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

在 SpringBoot3 中使用 Mybatis-Plus 报错

在 SpringBoot3 中使用 Mybatis-Plus 报错 Property ‘sqlSessionFactory’ or ‘sqlSessionTemplate’ are required Caused by: java.lang.IllegalArgumentException: Property sqlSessionFactory or sqlSessionTemplate are requiredat org.springframework.util.Assert.no…

Android随手记

activity的生命周期 创建时 onCreate() - onStart() - onResume() - onPause() - onStop() - onDestroy() 切换时 a切换到b a.onCreate() - a.onStart() - a.onResume - a.onPause - b.onCreate() - b.onStart() - b.onResume() - a.onStop() b切换回a b.onPause() - a.onR…

C++ 路径问题

目录 例1 例2 例3 例4 例5 例6 例1 62. 不同路径 1.初始化 2.当前位置的条数&#xff0c;就是上面位置的条数 &#xff0c;加上其左边位置的条数&#xff0c;dp[i][j] dp[i - 1][j] dp[i][j - 1]; 参考代码 class Solution { public:int uniquePaths(int m, int n) …

蓝桥杯——123

123 二分等差数列求和前缀和数组 题目分析 连续一段的和我们想到了前缀和&#xff0c;但是这里的l和r的范围为1e12&#xff0c;明显不能用O(n)的时间复杂度去求前缀和。那么我们开始观察序列的特点&#xff0c;可以按照等差数列对序列进行分块。如上图&#xff0c;在求前10个…

Python爬虫实战(基础篇)—13获取《人民网》【最新】【国内】【国际】写入Word(附完整代码)

文章目录 专栏导读背景测试代码分析请求网址请求参数代码测试数据分析利用lxml+xpath进一步分析将获取链接再获取文章内容测试代码写入word完整代码总结专栏导读 🔥🔥本文已收录于《Python基础篇爬虫》 🉑🉑本专栏专门针对于有爬虫基础准备的一套基础教学,轻松掌握Py…

idea Gradle 控制台中文乱码

如下图所示&#xff0c;idea 中的 Gradle 控制台中文乱码&#xff1a; 解决方法&#xff0c;如下图所示&#xff1a; 注意&#xff1a;如果你的 idea 使用 crack 等方式破解了&#xff0c;那么你可能需要在文件 crack-2023\jetbra\vmoptions\idea.vmoptions 中进行配置&#xf…

Qt for WebAssembly : Application exit (SharedArrayBuffer is not defined)

用Qt开发 WebAssembly&#xff0c;放到nginx里面&#xff0c;用127.0.0.1访问没问题&#xff0c;用局域网IP访问就提示如下&#xff1a; 总结了以下两种解决办法&#xff1a; ①&#xff1a;配置 nginx http 头 [ 支持&#xff1a;WebAssembly Qt (single-threaded) ] ②&#…

生成商品条码

php生成商品条码&#xff0c;编码格式为&#xff1a;EAN13 下载第三方包&#xff1a;composer require codeitnowin/barcode 生成条码代码&#xff1a; $filename \Str::random(40) . .png;$barcode new BarcodeGenerator();$barcode->setText($barCode);$barcode->s…

Vue3.0 vue.js.devtools无法显示Pinia调试工具

之前的配置方式&#xff1a; app.use(createPinia()) app.mount(#app) 更新配置方式&#xff1a; app.use(createPinia()).mount("#app") 设置之后即可显示调试工具

吴恩达deeplearning.ai:数据增强数据合成迁移学习

以下内容有任何不理解可以翻看我之前的博客哦&#xff1a;吴恩达deeplearning.ai专栏 让我们看看为你的程序添加数据的技巧。在构建神经网络的时候&#xff0c;我们总是想要更多的数据&#xff0c;但是获取更多的数据往往是十分昂贵又缓慢的。相反地&#xff0c;添加数据的另一…

Android耗电分析之Battery Historian工具使用

Battery-Historian是谷歌推出的一款专门分析Bugreport的工具&#xff0c;是谷歌在2015年I/O大会上推出的一款检测运行在android5.0(Lollipop)及以后版本的设备上电池的相关信息和事件的工具&#xff0c;是一款对于分析手机状态&#xff0c;历史运行情况很好的可视化分析工具。 …

Flink实时数仓之用户埋点系统(一)

需求分析及框架选型 需求分析数据采集用户行为采集业务数据采集 行为日志分析用户行为日志页面日志启动日志APP在线日志 业务数据分析用户Insert数据用户Update数据 技术选型Nginx配置Flume配置MaxWellHadoopFlink架构图 需求分析 数据采集 用户行为采集 行为数据&#xff1…