在Asp.net SignalR与Angular通信添加身份认证(通过jwt)

这是一个复杂的东西,我查找了一些混乱的资料,最终在混乱的状态成功了,然后我尝试阅读代码,并删除了一些重复的东西,并以一种较为简洁的方式成功。

示例hubs端点

app.MapHub<MessageHub>("/hubs/message");

我假设你已经知道如何添加SignalR和通常的使用jwt的验证。

这包括

处理跨域, 添加身份,数据库,账户,驱动,身份验证。

在这种情况下,只需要额外添加

builder.Services.AddAuthentication(options =>{options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;}).AddJwtBearer(options =>{options.TokenValidationParameters = new TokenValidationParameters{ValidateIssuer = true,ValidateAudience = true,ValidateLifetime = true,ValidateIssuerSigningKey = true,ValidIssuer = jswSettings.Issuer,ValidAudience = jswSettings.Audience,IssuerSigningKey = new SymmetricSecurityKey(secretKey)};options.Events = new JwtBearerEvents();});
builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<IPostConfigureOptions<JwtBearerOptions>,ConfigureJwtBearerOptions>());

其中 

ConfigureJwtBearerOptions 是自定义的类,这个设计思路来自于微软的指南,是通过添加类似于中间件的形式实现。

如果不添加

options.Events = new JwtBearerEvents();

会在后面的(上面的)组件中提示空对象。

using Microsoft.IdentityModel.Tokens;using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Extensions.Options;
public class ConfigureJwtBearerOptions : IPostConfigureOptions<JwtBearerOptions>
{public void PostConfigure(string? name, JwtBearerOptions options){var originalOnMessageReceived = options.Events.OnMessageReceived;options.Events.OnMessageReceived = async context =>{await originalOnMessageReceived(context);if (string.IsNullOrEmpty(context.Token)){var accessToken = context.Request.Query["access_token"];var path = context.HttpContext.Request.Path;if (!string.IsNullOrEmpty(accessToken) &&path.StartsWithSegments("/hubs/message")){context.Token = accessToken;}}};options.Events.OnAuthenticationFailed = context =>{if (context.Exception.GetType() == typeof(SecurityTokenExpiredException)){context.Response.Headers.Append("Token-Expired", "true");}else if (context.Exception.GetType() == typeof(SecurityTokenInvalidLifetimeException)){context.Response.Headers.Append("Token-Expired", "true");}return Task.CompletedTask;};}
}

 这个可以忽略

options.Events.OnAuthenticationFailed

主要的逻辑是 设置上下文的 token。

最后在中心上设置相应的要求

[Authorize(Policy = "user")]
public class MessageHub: Hub

这里使用的是之前配置的身份验证。

builder.Services.AddAuthorization(options =>
{options.AddPolicy("admin", policy => policy.RequireRole(["admin"]));options.AddPolicy("user", policy => policy.RequireRole(["user"]));options.AddPolicy("vip", policy => policy.RequireRole(["vip"]));
});

token中包含身份信息。在分发的token中包含。

private string GenerateToken(string username, int id){var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:SecretKey"]!));var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);var roles = _context.AccountRoles!.Where(a => a.AccountId == id).Include(r=>r.Role).ToList();var claims = new List<Claim> { new Claim(ClaimTypes.Name, username) };roles.ForEach(role =>{claims.Add(new Claim(ClaimTypes.Role,role.Role!.Name!));});var token = new JwtSecurityToken(issuer: _configuration["Jwt:Issuer"],audience: _configuration["Jwt:Audience"],claims: claims,expires: DateTime.Now.AddDays(3),signingCredentials: credentials);return new JwtSecurityTokenHandler().WriteToken(token);}

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

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

相关文章

循环测试之旅——深度解析Pytest插件 pytest-repeat

在软件开发中,测试的重要性不言而喻。而为了提高测试的鲁棒性和可靠性,Pytest插件 pytest-repeat 应运而生。这个插件可以帮助你轻松实现测试用例的循环运行,以更全面地评估代码的稳定性。本文将深入介绍 pytest-repeat 插件的基本用法和实际案例,助你更好地利用循环测试,…

chaper data writting

在大气科学领域的期刊论文中&#xff0c;这个章节应该清晰地说明数据的来源、获取方式、处理过程和分析方法&#xff0c;以便其他研究人员能够理解和验证研究结果。 示例结构 数据来源 描述数据的来源&#xff0c;包括观测、实验或模拟数据。说明数据的获取途径和原始数据集的…

Vue自定义成功弹窗H5实现类似于小程序的效果

效果图&#xff1a; <div class"father"><div class"success-box" v-if"isSuccess"><img src"../../assets/insure/success-logo.png" alt""><span>{{ successTitle }}</span></div> &…

安全防御第三次作业

作业&#xff1a;拓扑图及要求如下图 注&#xff1a;server1是ftp服务器&#xff0c;server2是http服务器 lsw1&#xff1a; 其中g0/0/0口为trunk 实现 1&#xff0c;生产区在工作时间内可以访问服务器区&#xff0c;仅可以访问http服务器 验证&#xff1a; 2&#xff0c;办公…

【DDD】学习笔记-领域驱动设计

领域驱动设计&#xff08;Domain Driven Design&#xff0c;DDD&#xff09;是由 Eric Evans 最早提出的综合软件系统分析和设计的面向对象建模方法&#xff0c;如今已经发展成为了一种针对大型复杂系统的领域建模与分析方法。它完全改变了传统软件开发工程师针对数据库进行的建…

Java数据结构与算法:字符串匹配算法之暴力匹配

Java数据结构与算法&#xff1a;字符串匹配算法之暴力匹配 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;一个热爱编程的程序猿。在计算机科学领域&#xff0c;字符串匹配一直是一个备受关注的问题。今天&#xff0c;我们将深入探…

JWT令牌(JSON Web Token)

目录 1 前言 2 JWT令牌的组成 3 使用步骤举例 3.1 pom.xml中引入依赖 3.2 JWT生成 3.3 JWT验证 4 实践中的使用举例 4.1 拦截非法访问 4.1.1 编写为工具类 4.1.2 下发给用户 4.1.3 编写拦截器 4.1.4 注册拦截器 4.2 获取相关数据提升效率 1 前言 在我们编写的后端…

跨平台Recorder录音插件:支持多种格式、音频可视化、实时上传、语音识别

视频教程地址&#xff1a;【跨平台Recorder录音插件&#xff1a;支持多种格式、音频可视化、实时上传、语音识别】 https://www.bilibili.com/video/BV1jQ4y1c7e4/?share_sourcecopy_web&vd_sourcee66c0e33402a09ca7ae1f0ed3d5ecf7c /** 先引入Recorder &#xff08; 需先…

LeetCode-题目整理【10】:单词搜索

先补充一些小知识&#xff1a; dfs和回溯的区别 深度优先搜索&#xff08;DFS&#xff09;和回溯是两种常用的算法思想&#xff0c;它们在解决问题时有一些相似之处&#xff0c;但也有一些不同之处。 深度优先搜索&#xff08;DFS&#xff09;是一种 用于遍历或搜索图、树或其…

LeetCode第559题 - N 叉树的最大深度

题目 解答 class Solution {public int maxDepth(Node root) {if (root null) {return 0;}if (root.children null || root.children.isEmpty()) {return 1;}int max Integer.MIN_VALUE;for (Node node : root.children) {max Math.max(maxDepth(node), max);}return max…

Python 列表应用案例:输入10个整数,计算平均值、方差和标准差,找出最大值和最小值

题目&#xff1a;输入10个整数&#xff0c;计算平均值、方差和标准差&#xff0c;找出最大值和最小值。 方差和标准差公式&#xff1a; Var ( X ) 1 n ∑ ( X i − X ˉ ) 2 \text{Var}(X) \frac{1}{n} \sum (X_i - \bar{X})^2 Var(X)n1​∑(Xi​−Xˉ)2 SD ( X ) Var ( X…

三篇论文联合复现:高比例新能源下考虑需求侧响应和智能软开关的配电网重构程序代码!

适用平台&#xff1a;MatlabYalmipCplex 程序在高比例新能源接入的情况下提出了考虑需求响应&#xff08;DR&#xff09;和智能软开关&#xff08;SOP&#xff09;的多时段主动配电网重构策略&#xff0c;进一步降低配电系统重构费用&#xff0c;减少弃风率和弃光率&#xff1…

深度学习与图像描述生成——图像描述生成方法(4)

目录 一、基于模板的方法 1.1 定义 1.2 原理 1.3 关键技术 1.4 发展历程 1.5 应用场景 1.6 特征 二、基于检索的方法 2.1 定义 2.2 原理 2.3 关键技术 2.4 发展历程 2.5 应用场景 2.6 特征 三、基于编码器-解码器架构的方法 3.1 定义 3.2 原理 3.3 关键技术 …

金融OCR领域实习日志(二)——四种OCR模型效果测试(附图)

文章目录 四种模型ocr效果简单测试模型场景1.paddle框架下PP-OCRv31.1.效果如下&#xff1a;1.2.总结 2.paddle框架下ppocr_server_v22.1.效果如下2.2.总结 3.CnOCR3.1.效果如下3.2.总结 4.TesseractOCR4.1.效果如下4.2.总结 5.后续想法 四种模型ocr效果简单测试 模型 PP-OCR…

【RT-DETR有效改进】 | 主干篇 | RevColV1可逆列网络(特征解耦助力小目标检测)

前言 大家好&#xff0c;这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进&#xff0c;内容持续更新&#xff0c;每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本&#xff0c;同时修改内容也支持ResNet32、ResNet101和PP…

JavaScript(JS)和TypeScript(TS)的区别

JavaScript&#xff08;JS&#xff09;和TypeScript&#xff08;TS&#xff09;都是编程语言&#xff0c;它们都可以用于构建交互式的Web应用程序。虽然它们有很多相似之处&#xff0c;但也有一些重要的区别。 JavaScript&#xff08;JS&#xff09; JavaScript是一种解释型脚…

Java面试提纲

JDK 1 jdk1.8版本后的新特性有哪些? Java Development Kit (JDK) 1.8&#xff08;也称为Java 8&#xff09;在2014年3月发布&#xff0c;引入了许多重要的新特性&#xff0c;以下是其中的一些关键特性&#xff1a; Lambda表达式&#xff1a; Java 8引入了lambda表达式&#x…

nginx复现负载均衡案例

这里是下载好了docker&#xff0c;并显示了下镜像这里是拉到了nginx的镜像这里是把容器起来&#xff0c;-itd是容器关闭后销毁这里是显示起来的容器进入到这个容器里面查看许多命令用不了&#xff0c;应该想办法把docker里的文件夹映射到物理机中 这里是如果访问6666端口那么隧…

【ARM 嵌入式 编译系列 3.7 -- newlib 库文件与存根函数 stubs 详细介绍】

请阅读【嵌入式开发学习必备专栏 之 ARM GCC 编译专栏】 文章目录 newlib 库文件介绍资源使用平台支持功能性能许可证兼容性系统调用函数介绍系统调用存根 stubs 详细介绍为什么需要系统调用存根(Stubs)?常见的系统调用存根如何实现系统调用存根如何告知编译器使用自定义存根…

cartographer离线建图报错:data_.trajectory_nodes.SizeOfTrajectoryOrZero

cartographer离线建图报错: data_.trajectory_nodes.SizeOfTrajectoryOrZero [FATAL] [1706177325.876019302, 1706015603.398505596]: F0125 18:08:45.000000 17607 pose_graph_2d.cc:1314] Check failed: data_.trajectory_nodes.SizeOfTrajectoryOrZero(trajectory_id) &…