Identity标识框架配上JWT的使用

news2025/6/21 7:37:49

在Identity标识框架的代码上继续编写

.Net中的标识框架Identity_风的艺术的博客-CSDN博客

添加NuGet包

NugetMicrosoft.AspNetCore.Authentication.JwtBearer

创建存储JWT数据类

public class JWTOptions

{

    public string SigningKey { get; set; }

    public int ExpireSeconds { get; set; }

}

在appsettings.json上设置你的对称密钥

"JWT": {

  "SigningKey": "fasdfad&9045dafz222#fadpio@0232",

  "ExpireSeconds": "86400"

}

配置JWT

//从配置文件中获取JWT数据

builder.Services.Configure<JWTOptions>(builder.Configuration.GetSection("JWT"));

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)

.AddJwtBearer(x =>

{

    //将配置文件的JWT数据转换为JWToptions这个类

    var jwtOpt = builder.Configuration.GetSection("JWT").Get<JWTOptions>();

    //创建对称安全密钥

    byte[] keyBytes = Encoding.UTF8.GetBytes(jwtOpt.SigningKey);

    var secKey = new SymmetricSecurityKey(keyBytes);

    //令牌验证参数配置

    x.TokenValidationParameters = new()

    {

        ValidateIssuer = false,

        ValidateAudience = false,

        ValidateLifetime = true,

        ValidateIssuerSigningKey = true,

        IssuerSigningKey = secKey

    };

});

创建一个方法用来生成token令牌

private static string BuildToken(IEnumerable<Claim> claims, JWTOptions options)

{

    DateTime expires = DateTime.Now.AddSeconds(options.ExpireSeconds);

    byte[] keyBytes = Encoding.UTF8.GetBytes(options.SigningKey);

    var secKey = new SymmetricSecurityKey(keyBytes);//获取对称安全密钥

    var credentials = new SigningCredentials(secKey,

        SecurityAlgorithms.HmacSha256Signature);//令牌的加密方式

    var tokenDescriptor = new JwtSecurityToken(expires: expires,

        signingCredentials: credentials, claims: claims);//完成令牌的制作

    return new JwtSecurityTokenHandler().WriteToken(tokenDescriptor);//返回令牌数据

}

创建一个新的登录,登录成功后生成一个令牌发送给客户端

[HttpPost]

public async Task<IActionResult> Login2(LoginRequest req,

            [FromServices] IOptions<JWTOptions> jwtOptions)

{

    string userName = req.UserName;

    string password = req.Password;

    var user = await userManager.FindByNameAsync(userName);

    if (user == null)

    {

        return NotFound($"用户名不存在{userName}");

    }

    var success = await userManager.CheckPasswordAsync(user, password);

    if (!success)

    {

        return BadRequest("Failed");

    }

    var claims = new List<Claim>();

    claims.Add(new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()));

    claims.Add(new Claim(ClaimTypes.Name, user.UserName));

    var roles = await userManager.GetRolesAsync(user);

    foreach (string role in roles)

    {

        claims.Add(new Claim(ClaimTypes.Role, role));

    }

    //登录成功后生成令牌,将令牌发送给客户端

    string jwtToken = BuildToken(claims, jwtOptions.Value);

    return Ok(jwtToken);

}

验证是否登录成功,如果没用登录成功不能访问该Action

[Authorize]验证Token是否合理

[HttpGet]

[Authorize]

public IActionResult Hello()

{

    string id = this.User.FindFirst(ClaimTypes.NameIdentifier)!.Value;

    string userName = this.User.FindFirst(ClaimTypes.NameIdentifier)!.Value;

    IEnumerable<Claim> roleClaims = this.User.FindAll(ClaimTypes.Role);

    string roleNames = string.Join(',', roleClaims.Select(c => c.Value));

    return Ok($"id={id},userName={userName},roleNames ={roleNames}");

}

执行Login2获取令牌数据

eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNobWFjLXNoYTI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1laWRlbnRpZmllciI6IjEiLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoieXprIiwiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS93cy8yMDA4LzA2L2lkZW50aXR5L2NsYWltcy9yb2xlIjoiQWRtaW4iLCJleHAiOjE2ODE5OTIyNDV9.jtbuWZEUFeh_pTKyrIvAlUyL50mKQeTQX_cTMrP0m34

使用Postman访问Hello

在请求头中添加一个键值。将令牌放置Value这边。Value的Bearer后面要有一个空格之后将令牌粘贴上去,令牌复制时不能有空格换行,否则会报错401

[Authorize]的注意事项

  • ASP.NET Core中身份验证和授权验证的功能由Authentication、Authorization中间件提供app.UseAuthentication()、app.UseAuthorization() 。
  • 控制器类上标注[Authorize],则所有操作方法都会被进行身份验证和授权验证;对于标注了[Authorize]的控制器中,如果其中某个操作方法不想被验证,可以在操作方法上添加[AllowAnonymous]。
  • ASP.NET Core会按照HTTP协议的规范,从Authorization取出来令牌,并且进行校验、解析,然后把解析结果填充到User属性中,这一切都是ASP.NET Core完成的,不需要开发人员自己编写代码。但是一旦出现401,没有详细的报错信息,很难排查,这是初学者遇到的难题。
  • 可以在[Authorize]特性后面补充参数例如只能允许指定角色访问该Action,其他角色访问该Action会出现403报错

[Authorize(Role="admin")]

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

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

相关文章

嵌入式51单片机03-数码管系列

文章目录 数码管一、数码管基础知识二、数码管系列代码1. 数码管操作&#xff08;单个数码管静态显示&#xff09;&#xff08;1&#xff09;仿真电路图&#xff08;2&#xff09;源代码&#xff08;3&#xff09;实验结果 2. 数码管操作&#xff08;多个数码管静态显示&#x…

CSDN官方文章MD编辑器文章示例

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

Day950.遗留系统的四化建设 -遗留系统现代化实战

遗留系统的四化建设 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于遗留系统的四化建设的内容。 对于老旧、过时&#xff0c;但又十分重要、不可替代的遗留系统&#xff0c;是遗留系统。听之任之只会埋下隐患&#xff0c;真正出现问题就为时已晚了。在动手改造遗留…

【蓝桥杯省赛真题39】Scratch棒球本垒打 少儿编程scratch图形化编程 蓝桥杯省赛真题讲解

目录 scratch棒球本垒打 一、题目要求 编程实现 二、案例分析 1、角色分析

托福高频真词List01 // 附阅读真题

4月18日单词 &#x1f36e;segregateseparateV.隔离&#x1f36e;leftover remainingadj.剩余的 &#x1f36e;rivalcompetitor &#x1f36e;rivalcompete n.对手&#x1f36e; v.对抗&#x1f36e; apparentlyseeminglyadv.显然 &#x1f36e;unrivaledunequaledadj.无与伦…

Create a Process for Managing Support Cases

文章目录 前言&学习目标学习目标背景 一&#xff0c;Create Support Processes1.创建用户2.创建Processes3.创建Record Types4.创建升级规则(Escalation Rule) 前言&学习目标 记录trailhead学习重点&#xff0c;创建管理支持个案的流程&#xff0c;简化工作流并用新的…

mysql企业级安装部署(保姆级别教程)

前言 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;属于 Oracle 旗下产品。MySQL是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的 RDBMS (Relational Database Management System&#xff0c;关系…

Spring——利用五大类注解和Bean注解实现更简单的存储

目录 一、配置扫描路径 二、使用注解存储Bean对象 2.1 Controller&#xff08;控制器存储&#xff09; 2.1.1 bean标签是否可以和component-san一起使用呢&#xff1f; 2.2 Service(服务存储) 2.3 Repository 2.4 Component 2.5 Configuration 2.6 五大类注解可以不在…

27岁,测试在职近5年,月薪不到2W,担心被应届生取代

工作了近5年&#xff0c;一个月工资不到20K&#xff0c;担心被应届毕业生取代&#xff01;互联网的快速发展伴随着员工适者生存的加速&#xff0c;测试员的薪资也在不断增长&#xff0c;以3年、5年、8年为一条分水岭。如果人们的能力和体力不够&#xff0c;他们就会被淘汰。看起…

Android添加C++/CPP项目代码(2)

Android添加C/CPP项目代码&#xff08;2&#xff09; &#xff08;1&#xff09;选中某个module&#xff0c;右键&#xff0c;Add C to Module 在随后弹出的选项框中选第一个&#xff0c;OK。 &#xff08;2&#xff09;此时会在app下产生一个cpp目录和两个文件&#xff1a; x…

TiDB实战篇-BR进行数据备份与恢复

简介 使用BR进行数据备份与恢复。 原理 Backup备份的时候在PD上面找到表的元数据&#xff0c;然后找到对应的TiKV数据以后&#xff0c;直接备份到外部系统中&#xff08;注意如果没有像HDFS这样的分布式文件存储&#xff0c;那么它每个TiKV备份到本地的文件就只有一部分数据&…

nssctf web 入门(10)

[NISACTF 2022]midlevel [NISACTF 2022]midlevel 尝试使用x-forwarded-for 发现可行判断是不是ssti 确定是ssti模板注入 [NISACTF 2022]is secret [NISACTF 2022]is secret 根据这个我们去看看secret 这里看到这个猜测是通过get传入secret的值然后会机密我们的值 我们发现传…

优秀软件方法学“漫游记”

你好&#xff0c;我是东&#xff08;在极客时间的 ID 是 Fredo&#xff09;。大学的时候我读的是计算机专业&#xff0c;现在是一名工作了近3年的程序员&#xff0c;很高兴能和你分享我的学习体会。 我是怎样学习课程的&#xff1f; 首先聊聊我是怎么学习这门课的。 DDD 是一…

智网工程师培训一些心得

智网工程师培训一些心得 MYSQLApache Flask开发小程序 MYSQL MYSQL的日期如果定义为datetime类型&#xff0c;比较的时候可以使用 entry_form.exercise_date between 2022-1-1 and 2023-4-19 日期可以是非2位宽对齐方式 日期比较也可以使用大于或者小于号MYSQL支持定时备份数…

学习数据结构第6天(栈的基本概念)

栈的基本概念 栈的定义栈的基本操作栈的存储结构 栈的定义 栈(Stack)是一种基于先进后出(FILO)或者后进先出(LIFO)的数据结构&#xff0c;是一种只允许在一端进行插入和删除操作的特殊线性表。 栈按照先进后出的原则存储数据&#xff0c;先进入的数据被压入栈底&#xff0c;最…

数据结构初阶(链表)

文章目录 一、链表的基础概念1.1 什么是链表1.2 分类1.3 链表的底层代码1.4 例题1.5 LinkedList 的实现&#xff08;1&#xff09;什么是LInkedList&#xff08;2&#xff09;底层代码&#xff08;3&#xff09;LinkedLIst的使用 1.6 ArrayList和LinkedList的区别 一、链表的基…

Spring底层架构核心概念

文章目录 Spring底层架构核心概念BeanDefinitionBeanDefinitionReaderAnnotatedBeanDefinitionReaderXmlBeanDefinitionReaderClassPathBeanDefinitionScanner BeanFactoryApplicationContext国际化资源加载获取运行时环境事件发布 类型转换PropertyEditorConversionServiceTyp…

20行Python代码获取 心碎榜单文件保存本地,准备开始emo......

人生苦短 我用python&#xff08;emo版&#xff09; (语气充满悲伤…) 今天咱们试试只用20行代码来实现 批量获取 某某云 文件保存本地&#xff0c;炒鸡简单&#xff01; 悄悄的告诉你&#xff0c;其实不到20行代码~ 事前准备 软件环境 环境Python3.8编辑器是pycharm 模块…

轻松掌握k8s的kubectl使用命令行操作01知识点

程序员使用的kubectl&#xff0c;只能在主节点使用kubectl命令 1、查看集群所有节点 kubectl get nodes 2、根据配置文件&#xff0c;给集群创建资源 kubectl apply -f xxxx.yaml 3、查看集群部署了哪些应用 kubectl get pods -A 4、指定查看命名空间部署了哪些应用 不指…

[DSCoding2] 反转链表——迭代法

题目描述 核心思路 观察上图可以发现&#xff0c;将链表反转后&#xff0c;原有的结点间的引用关系发生了改变&#xff0c;比如反转前1指向2&#xff0c;反转后2指向1&#xff0c; 所以我们可以从修改节点间的引用关系下手。 在遍历链表时&#xff0c;将当前节点的next指针指向…