ASP.NET Core 3.1中使用JWT身份认证

文章目录

    • 0、引言
    • 1、关于Authentication与Authorization
    • 2、整个认证流程是怎样的?
    • 3、开始JWT身份认证
        • 3.1 安装JwtBearer包
        • 3.2 安装Swashbuckle.AspNetCore包
        • 3.3 添加身份认证相关服务到容器中
        • 3.4 添加Swagger服务到容器中
        • 3.5 将身份认证加入到管道中
        • 3.6 将swagger加入到管道中
        • 3.7 在需要授权的资源上加入Authorize
    • 4 、测试
        • 4.1 请求资源
        • 4.2 调用登录获取token
        • 4.3 将token添加到Header中
        • 4.4 再次请求
        • 4.5 切换admin账户登录
    • 5、登录逻辑代码

0、引言

若不清楚什么是JWT的请先了解下什么是JWT。

1、关于Authentication与Authorization

我相信在aspnet core中刚接触甚至用了段时间这两个概念的时候都是一头雾水的,傻傻分不清。
认证(Authentication)和授权(Authorization)在概念上比较的相似,且又有一定的联系,因此很容易混淆。
认证(Authentication)是指验证用户身份的过程,即当用户要访问受保护的资源时,将其信息(如用户名和密码)发送给服务器并由服务器验证的过程。
授权(Authorization)是验证一个已通过身份认证的用户是否有权限做某件事情的过程。
有过RBAC的开发经验者来说这里可以这么通俗的来理解:认证是验证一个用户是否“合法”(一般就是检查数据库中是否有这么个用户),授权是验证这个用户是否有做事情的权限(简单理解成RBAC中的用户权限)。

2、整个认证流程是怎样的?

整个HTTP请求流程
从图中可以看到整个认证、授权的流程,先进行身份验证 ,验证通过后将Token放回给客户端,客户端访问资源的时候请求头中添加Token信息,服务器进行验证并于授权是否能够访问该资源。

3、开始JWT身份认证

3.1 安装JwtBearer包

在.csproj项目中添加JWT包(这里添加有很多种方式,自行选择)

<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="3.1.3" />

3.2 安装Swashbuckle.AspNetCore包

这里便于进行测试,引入Swagger工具。

<PackageReference Include="Swashbuckle.AspNetCore" Version="5.3.1" />

3.3 添加身份认证相关服务到容器中

services.AddAuthentication(options =>
{options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{options.TokenValidationParameters = new TokenValidationParameters{ValidateIssuer = false,ValidateAudience = false,ValidateLifetime = false,ValidateIssuerSigningKey = true,ValidIssuer = "jonny",ValidAudience = "jonny",IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("secretsecretsecret"))};
});

说明

配置项类型说明
ValidateIssuerSigningKeybool是否调用对签名securityToken的SecurityKey进行验证。
ValidIssuerstring将用于检查令牌的发行者是否与此发行者相同。
ValidateIssuerbool是否验证发行者
ValidAudiencestring检查令牌的受众群体是否与此受众群体相同。
ValidateAudiencebool在令牌验证期间验证受众 。
ValidateLifetimebool验证生命周期。

3.4 添加Swagger服务到容器中

services.AddSwaggerGen(options =>
{options.SwaggerDoc("openapi", new Microsoft.OpenApi.Models.OpenApiInfo{Title = "统一身份认证API",Description = "身份认证和授权详解",Version = "v1"});var scheme = new OpenApiSecurityScheme(){Scheme = JwtBearerDefaults.AuthenticationScheme,BearerFormat = "JWT",In = ParameterLocation.Header,//头名称Name = ApiKeyConstants.HeaderName,Type = SecuritySchemeType.ApiKey,Description = "Bearer Token"
};
options.AddSecurityDefinition(JwtBearerDefaults.AuthenticationScheme, scheme);
options.AddSecurityRequirement(new OpenApiSecurityRequirement(){{new OpenApiSecurityScheme{Reference = new OpenApiReference{Type = ReferenceType.SecurityScheme,Id = "Bearer"}},new string[] {}}});
});

aspnet core 3.x swagger与2.x有细微的差别,例如swagger中加入jwt和以前就有一定的差别。

swagger加入身份认证后出现了认证按钮。
在这里插入图片描述

3.5 将身份认证加入到管道中

//身份认证中间件(踩坑:授权中间件必须在认证中间件之前)
app.UseAuthentication();

3.x中身份认证一定要在UseRouting和UseEndpoints之间

3.6 将swagger加入到管道中

app.UseSwagger();
app.UseSwaggerUI(options =>
{options.RoutePrefix = string.Empty;//配置swagger端点options.SwaggerEndpoint("swagger/openapi/swagger.json", "openapi v1");
});

3.7 在需要授权的资源上加入Authorize

例如:

[HttpGet("role")]
[Authorize(Roles = "admin")]
public IEnumerable<Claim> GetRole()
{return HttpContext.User.FindAll(c => c.Type == ClaimTypes.Role);
}

这里默认使用角色授权机制

4 、测试

4.1 请求资源

这时会返回401,因为没有进行身份认证
在这里插入图片描述

4.2 调用登录获取token

在这里插入图片描述

4.3 将token添加到Header中

在这里插入图片描述

4.4 再次请求

这时返回403,是因为使用的jonny账户登录的没有admin权限。
在这里插入图片描述

4.5 切换admin账户登录

在这里插入图片描述
重复上面的4.3、4.4步骤 。再次测试。这时就能正常访问。
在这里插入图片描述

5、登录逻辑代码

我这里就不做过多的解释 ,直接将相关创建JTW代码等贴出来。

public interface ICustomAuthenticationManager
{string Authenticate(string username, string password);IDictionary<string, string> Tokens { get; }
}
public class CustomAuthenticationManager : ICustomAuthenticationManager
{private readonly IDictionary<string, string> users = new Dictionary<string, string>{{ "admin", "admin" },{ "jonny", "jonny" },{ "xhl", "xhl" },{ "james", "james" }};public IDictionary<string, string> Tokens { get; } = new Dictionary<string, string>();public string Authenticate(string username, string password){var claimsIdentity = new ClaimsIdentity(new[]{new Claim(ClaimTypes.Name,username)});if (!users.Any(u => u.Key == username && u.Value == password)){return null;}if (username == "admin"){claimsIdentity.AddClaims(new[]{new Claim( ClaimTypes.Email, "xhl.jonny@gmail.com"),new Claim( "ManageId", "admin"),new Claim(ClaimTypes.Role,"admin")});}var handler = new JwtSecurityTokenHandler();var tokenDescriptor = new SecurityTokenDescriptor{Subject = claimsIdentity,Expires = DateTime.Now.AddMinutes(3),SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes("secretsecretsecret")), SecurityAlgorithms.HmacSha256),};var securityToken = handler.CreateToken(tokenDescriptor);var token = handler.WriteToken(securityToken);Tokens.Add(token, username);return token;}
}

上面使用内存数据进行逻辑验证 ,实际中需要使用数据库查询验证等。

今天的JWT身份认证就介绍完了 ,下一篇文章将介绍授权。角色授权、身份授权(Claim)、自定义策略授权。


---------------------
作者:Jonny Lin
来源:CSDN
原文:https://blog.csdn.net/xhl_james/article/details/105343253
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

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

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

相关文章

《ASP.NET Core 6框架揭秘》实例演示[10]:Options基本编程模式

依赖注入使我们可以将依赖的功能定义成服务&#xff0c;最终以一种松耦合的形式注入消费该功能的组件或者服务中。除了可以采用依赖注入的形式消费承载某种功能的服务&#xff0c;还可以采用相同的方式消费承载配置数据的Options对象&#xff0c;这篇文章演示几种典型的编程模式…

实现仿简书选取内容生成分享图片效果

前几天脑子里忽然闪过简书的图片分享效果&#xff0c;感觉很简洁也很漂亮&#xff0c;想着能不能用自己方式实现一下呢&#xff0c;于是今天就有了这篇文章。好了&#xff0c;先看下效果图吧&#xff1a; 项目地址: https://github.com/zhangke301... 欢迎star、issues~ 实现这…

千万级可观测数据采集器--iLogtail代码完整开源

2022年6月29日&#xff0c;阿里云iLogtail开源后迎来首次重大更新&#xff0c;正式发布完整功能的iLogtail社区版。本次更新开源全部C核心代码&#xff0c;该版本在内核能力上首次对齐企业版&#xff0c;开发者可以构建出与企业版性能相当的iLogtail云原生可观测性数据采集器。…

Java8新特性--CompletableFuture

并发与并行 Java 5并发库主要关注于异步任务的处理&#xff0c;它采用了这样一种模式&#xff0c;producer线程创建任务并且利用阻塞队列将其传递给任务的consumer。这种模型在Java 7和8中进一步发展&#xff0c;并且开始支持另外一种风格的任务执行&#xff0c;那就是将任务的…

用 MAUI 在Windows 和 Linux 绘制 PPT 图表

我在做一个图表工具软件&#xff0c;这个软件使用 MAUI 开发。我的需求是图表的内容需要和 PPT 的图表对接&#xff0c;需要用到 OpenXML 解析 PPT 内容&#xff0c;读取到 PPT 图表元素的内容&#xff0c;接着使用 MAUI 渲染层绘制图表元素。图表工具软件需要在 Windows 平台和…

聊聊接口性能优化的11个小技巧

前言 接口性能优化对于从事后端开发的同学来说&#xff0c;肯定再熟悉不过了&#xff0c;因为它是一个跟开发语言无关的公共问题。 该问题说简单也简单&#xff0c;说复杂也复杂。 有时候&#xff0c;只需加个索引就能解决问题。 有时候&#xff0c;需要做代码重构。 有时…

Java中ArrayList,LinkedList,Vector三者的异同点及其使用场景和ArrayList的一些常用方法

相同点&#xff1a;三者存储的都是有序&#xff0c;可重复的数据。 异&#xff1a; ①&#xff1a;ArrayList底层存储类型是Object数组&#xff0c;而LinkedList底层是双向链表 ②&#xff1a;ArrayList和Vector调用创建空参构造器创建对象时&#xff0c;默认的size是10&…

第二百四十六节,Bootstrap弹出框和警告框插件

Bootstrap弹出框和警告框插件 学习要点&#xff1a; 1.弹出框 2.警告框 本节课我们主要学习一下 Bootstrap 中的弹出框和警告框插件。 一&#xff0e;弹出框 弹出框即点击一个元素弹出一个包含标题和内容的容器。 基本用法 注意&#xff1a;必须在js结合popover()方法使用 da…

Intellij IDEA2017 的控制台里不识别maven命令问题处理

2019独角兽企业重金招聘Python工程师标准>>> cmd里运行 mvn -v可以显示出maven的版本信息&#xff0c;可是在IDEA的控制台里却提示不识别maven命令&#xff0c;此情况以管理员的身份运行IDEA即可。 转载于:https://my.oschina.net/u/2364025/blog/1788797

使用IDEA 提交代码到svn

2019独角兽企业重金招聘Python工程师标准>>> 新手第一次使用教程&#xff1a; 一、安装svn TortoiseSVN是个客户端&#xff0c;需要安装VisualSVN服务端。 二、IDEA配置&#xff08;Ctrl alt S&#xff09; 需要配置服务端svn.exe文件。 三、上传代码 svn路径&…

如何在 BackgroundService 获取 ASP.NET Core 启动地址

前言上次&#xff0c;我们介绍了《如何获取 ASP.NET Core 启动地址》。但是&#xff0c;如果要在 BackgroundService 中获取启动地址可不那么容易&#xff0c;因为 BackgroundService 在 app 启动前就开始执行了:var builder WebApplication.CreateBuilder(args); builder.Ser…

016-Spring Boot JDBC

一、数据源装配 通过查看代码可知&#xff0c;默认已装配了数据源和JdbcTemplate System.out.println(context.getBean(DataSource.class)); System.out.println(context.getBean(JdbcTemplate.class)); 1.1、环境搭建 主要是pom引用&#xff1a;spring-boot-starter-jdbc、增加…

分库分表和 NewSQL 到底怎么选?

文章来源&#xff1a;【公众号&#xff1a;CoderW】 目录 背景 分表 分库 分库分表的成本 NewSQL NewSQL 平滑接入方案 NewSQL 真的有那么好吗&#xff1f; NewSQL 的应用 分库分表和 NewSQL 到底怎么选&#xff1f; 背景 曾几何时&#xff0c;“并发高就分库&#xff…

jQuery/javascript实现简单网页计算器

1 <html>2 <head>3 <meta charset"utf-8">4 <title>jQuery实现</title>5 <script src"jquery.js"></script>6 7 <style type"text/css">8 table{background-color:pink;width:300px;height…

雷军招人反被3句话问懵:当我在面试牛人的时候,牛人也在面试我

来 源&#xff5c;环球人力资源智库&#xff08;GHRlib&#xff09; 作 者&#xff5c;Black “你做过手机吗&#xff1f;” “没做过。” “你认识中移动老总王建宙吗&#xff1f;” “不认识。” “你认识富士康老板郭台铭吗&#xff1f;” “我认识他&#xff0c;他不认识我…

C# 11 中的 required members

C# 11 中的 required membersIntro在 C# 11 中引入了一个新的特性 —— Required Members&#xff0c;引入了一个新的 required 关键词&#xff0c;可以用来表示字段或者属性在类型初始化的时候必须要进行初始化&#xff0c;这一特性也进一步的改进了可空引用类型的用法。Sampl…

互联网大佬简史:马云/雷军/罗永浩/刘强东...

燃财经&#xff08;ID:rancaijing&#xff09;原创 作者 | 杜枫 编辑 | 魏佳中国互联网的发展&#xff0c;是一部由大佬撑起的奋斗史&#xff0c;也是一部由大佬主演的打脸史。和传统行业不同&#xff0c;互联网行业日新月异&#xff0c;从业者趋于年轻。马云唱起了摇滚&#x…

Windows 11 新版 22621.575 和 22622.575 推送:照片、URL、文件资源管理器

面向 Beta 频道的 Windows 预览体验成员&#xff0c;微软推送了 Windows 11 预览版 Build 22621.575 和 22622.575。 目前 Beta 频道 Windows 11 预览版分为两组进行测试&#xff0c;通过两组 Windows 预览体验成员的使用数据和反馈&#xff0c;以更好的测试新功能的可靠性。Wi…

linux mysql5.6 安装

2019独角兽企业重金招聘Python工程师标准>>> 1、gcc yum install gcc gcc-c ncurses-devel perl 2、cmake安装 wget http://www.cmake.org/files/v2.8/cmake-2.8.10.2.tar.gz tar -xzvf cmake-2.8.10.2.tar.gz cd cmake-2.8.10.2 ./bootstrap ; make ; make insta…

Python常用的12个GUI框架

Graphical User Interface&#xff0c;简称 GUI&#xff0c;又称图形化用户接口&#xff0c;所谓的GUI编程&#xff0c;指的是用户不需要输入代码指令&#xff0c;只通过图形界面的交互就可以操作软件功能。 1.Tkinter 一个轻量级的跨平台图形用户界面&#xff08;GUI&#xff…