【个人博客搭建】(20)获取操作用户信息(IHttpContextAccessor)

IHttpContextAccessor在ASP.NET Core中扮演着至关重要的角色。它为开发者提供了一种方便的方式来访问和操作HttpContext对象,从而允许在整个应用程序中轻松地管理和使用HTTP请求和响应的相关信息。下面将深入探讨IHttpContextAccessor的作用、使用方法以及如何通过它来优化Web API的开发流程:

  1. 访问HttpContext
    • 中间件和应用框架中的使用:HttpContext封装了有关个别HTTP请求和响应的所有信息,当收到HTTP请求时,HttpContext实例会进行初始化。这个实例可以通过中间件和应用框架(如Web API控制器、Razor Pages等)访问。
    • 读取请求头和响应头:通过HttpRequest和HttpResponse的属性,可以访问和使用HTTP请求和响应的头部信息,这对于处理HTTP通信中的重要元数据至关重要。
    • 读取请求正文:HTTP请求可以包含请求正文,例如HTML窗体的内容、UTF-8 JSON有效负载或文件。IHttpContextAccessor允许读取这些数据,这对于处理客户端发送的数据非常重要。
  2. 中间件中的应用
    • 启用请求正文缓冲:在某些情况下,需要多次读取请求正文。IHttpContextAccessor提供了扩展方法来缓冲HTTP请求正文,并支持大型请求正文的处理。
    • 处理OPTIONS预检请求:在处理跨域请求时,正确处理OPTIONS预检请求是必要的。通过IHttpContextAccessor,可以设置允许的HTTP方法和头部字段,以确保CORS策略的正确实施。
  3. 依赖注入
    • 注册IHttpContextAccessor服务:在Startup类的ConfigureServices方法中,需要注册IHttpContextAccessor为一个单例服务,这样它就可以在应用程序的其他部分通过依赖注入来使用。
    • 使用中间件配置静态HttpContext:通过扩展方法,可以在应用的中间件管道中配置IHttpContextAccessor,以便在整个应用程序中使用HttpContext.Current。
  4. 安全性考虑
    • 避免线程安全问题:HttpContext不是线程安全的,因此在并行任务中直接引用HttpContext数据可能会导致异常。应传递所需的数据而不是HttpContext本身,以避免不安全代码。
    • 管理用户身份:IHttpContextAccessor可以用于获取或设置请求的用户,这在处理身份验证和授权时非常有用。
  5. 功能接口集合
    • 访问请求功能:HttpContext提供对当前请求的功能接口集合的访问。这些功能集合是可变的,可以通过中间件来修改,以添加对其他功能的支持。
    • 使用高级API:通过BodyReader属性,可以直接访问请求正文,这种高级的、高性能的方法适合那些需要高效处理请求数据的应用场景。

此外,在使用IHttpContextAccessor时,还应注意以下几点:

  • 响应写入注意事项:在写入响应正文时,必须注意响应是否已启动,因为一旦响应启动,标头将变为只读。
  • 处理取消令牌:在执行长时间运行的任务时,应使用RequestAborted取消令牌,以便在请求中止时能够及时停止任务。
  • 异步操作中的应用:在异步操作中,应将IHttpContextAccessor作为参数传递,以确保在等待异步操作完成时不会引用到已经结束的请求上下文。

综上所述,IHttpContextAccessor在ASP. NET Core中提供了一种灵活且强大的机制,用于访问和操作HttpContext实例。它不仅简化了对HTTP请求和响应信息的访问,而且还支持中间件和应用框架中的高级功能。通过合理利用IHttpContextAccessor,开发者可以更加高效地构建和管理Web API,同时也要注意其安全性和性能方面的考量。

1、创建IHttpContextUser接口

 public interface IHttpContextUser{string Name { get; }int JwtID { get; }bool IsAuthenticated();IEnumerable<Claim> GetClaimsIdentity();List<string> GetClaimValueByType(string ClaimType);string GetToken();List<string> GetUserInfoFromToken(string ClaimType);#region 拓展(具体使用的)int userId { get; }string userName { get; }string userAccount { get; }#endregion}

 2、实现接口,创建类AspNetUser

public class AspNetUser : IHttpContextUser
{private readonly IHttpContextAccessor _accessor;public AspNetUser(IHttpContextAccessor accessor){_accessor = accessor;}public string Name => _accessor.HttpContext.User.Identity.Name;/// <summary>/// 是jwt的唯一身份标识,主要用来作为一次性的token,从而回避重放攻击,可以用uuid进行设置/// </summary>public int JwtID => GetClaimValueByType("jti").FirstOrDefault().ObjToInt();/// <summary>/// 是否通过验证/// </summary>/// <returns></returns>public bool IsAuthenticated(){return _accessor.HttpContext.User.Identity.IsAuthenticated;}/// <summary>/// 获取token/// </summary>/// <returns></returns>public string GetToken(){return _accessor.HttpContext.Request.Headers["Authorization"].ObjToString().Replace("Bearer ", "");}public List<string> GetUserInfoFromToken(string ClaimType){var jwtHandler = new JwtSecurityTokenHandler();if (!string.IsNullOrEmpty(GetToken())){JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(GetToken());return (from item in jwtToken.Claimswhere item.Type == ClaimTypeselect item.Value).ToList();}else{return new List<string>() { };}}public IEnumerable<Claim> GetClaimsIdentity(){return _accessor.HttpContext.User.Claims;}public List<string> GetClaimValueByType(string ClaimType){return (from item in GetClaimsIdentity()where item.Type == ClaimTypeselect item.Value).ToList();}#region MyRegion 拓展public int userId => GetClaimValueByType("userId").FirstOrDefault().ObjToInt();//账号idpublic string userName => GetClaimValueByType("userName").FirstOrDefault();//姓名public string userAccount => GetClaimValueByType("userAccount").FirstOrDefault();//登录账号名#endregion}

3、注入服务:


#region HttpContext 相关服务builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
builder.Services.AddScoped<IHttpContextUser, AspNetUser>();#endregion

4、测试:

        4.1、在user的接口那边加了个Test的方法,然后构造函数内添加IHttpContextUser 对象。获取

        private readonly Repository<SysUser> _usersRep;private readonly IHttpContextUser _user;public SysUserService(Repository<SysUser> usersRep, IHttpContextUser user){_usersRep = usersRep;_user = user;}public async Task<ApiResult> Test(){var userid = _user.userId;var username = _user.userName;var result = "userid:" + userid + ";username:" + username + ";" ;return ApiResultHelper.Success(result);}

        4.2、使用swagger或ApiPost调用:(记得携带Token)

        这样就可以带出存入Jwt中的相关信息了。

        如果需要其他信息,在生成Token时存入即可。

       可查看文章:【个人博客搭建】(10)添加JWT-CSDN博客

5、其他

        ......

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

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

相关文章

【区分vue2和vue3下的element UI lauout布局,分别详细介绍属性,事件,方法如何使用,并举例】

首先&#xff0c;需要澄清一点&#xff1a;Element UI 是基于 Vue 2 的组件库&#xff0c;它并没有直接为 Vue 3 提供官方支持。但是&#xff0c;有一些社区版本的 Element UI 试图兼容 Vue 3&#xff0c;比如 Element Plus。以下我会分别介绍 Element UI&#xff08;基于 Vue …

[ue5]建模场景学习笔记(1)——混合材质

卷首&#xff1a;这部分会记录建模场景等相关学习内容&#xff0c;与ue引擎学习笔记不同的是&#xff0c;可能会略过一些基础内容&#xff0c;因为部分知识在blender中已经学习过了&#xff0c;不再继续记录。 1.需求分析&#xff1a; 想构建一个山地的场景&#xff0c;在ue5中…

[RK3588-Android12] 关于EDP屏外设为Panel,不支持HPD的配置

问题描述 直接附上dts配置&#xff0c;也可自行查看先关文档RKDocs\common\display\Rockchip_RK3588_User_Guide_eDP_CN.pdf 解决方案&#xff1a; // EDP屏参数panel-edp {compatible "simple-panel";// 屏en脚 自行根据原理图配置enable-gpios <&gpioX R…

【扫雷game】

编写一个扫雷游戏程序需要考虑几个关键部分&#xff1a;游戏逻辑、用户界面和交互。这里我将提供一个基本的扫雷游戏逻辑的伪代码和概念&#xff0c;你可以使用Python等编程语言来实现它。 游戏逻辑 初始化游戏板 创建一个二维数组来表示游戏板&#xff0c;每个单元格可能包含…

解读vue3源码-1

提示&#xff1a;看到我 请让滚去学习 vue3渲染流程 文章目录 vue3渲染流程vue3的3个核心&#xff1a;1.响应式模块(Reactivity Module)--创建响应式数据2.编译模块(Compiler Module)--模版编译器将html转换为一个渲染函数3.渲染模块(Renderer Module) 渲染流程&#xff1a;1.首…

python办公自动化——(二)替换PPT文档中图形数据-柱图

效果: 数据替换前 &#xff1a; 替换数据后&#xff1a; 实现代码 import collections.abc from pptx import Presentation from pptx.util import Cm,Pt import pyodbc import pandas as pd from pptx.chart.data impo…

Python项目开发实战:酒店管理系统(案例教程)

一、引言 在当今信息化社会,酒店管理系统作为酒店运营的重要组成部分,其重要性不言而喻。一个高效、稳定的酒店管理系统不仅能提升酒店的运营效率,还能为顾客提供更为便捷、舒适的服务体验。本文将详细介绍如何使用Python语言开发一个基本的酒店管理系统,并从需求分析、系统…

【量算分析工具-贴地距离】GeoServer改造Springboot番外系列九

【量算分析工具-概述】GeoServer改造Springboot番外系列三-CSDN博客 【量算分析工具-水平距离】GeoServer改造Springboot番外系列四-CSDN博客 【量算分析工具-水平面积】GeoServer改造Springboot番外系列五-CSDN博客 【量算分析工具-方位角】GeoServer改造Springboot番外系列…

postman都有哪些功能?

接口测试 可以方便地发送 HTTP 请求&#xff0c;包括各种方法&#xff08;GET、POST、PUT、DELETE 等&#xff09;&#xff0c;并查看响应结果。 参数设置 能够灵活设置请求的参数&#xff0c;如查询参数、请求头、请求体等。 环境管理 支持创建不同的环境&#xff0c;方便…

Web前端三大主流框架技术分享

在当今快速发展的互联网时代&#xff0c;Web前端技术作为连接用户与服务的桥梁&#xff0c;其重要性不言而喻。随着技术的不断进步&#xff0c;为了提升开发效率、优化用户体验&#xff0c;一系列强大的前端框架应运而生。其中&#xff0c;Angular、React和Vue.js作为当前最为主…

广东海上丝绸之路文化促进会正式批复荐世界酒中国菜的指导单位

广东海上丝绸之路文化促进会正式批复成为“世界酒中国菜”系列活动指导单位 近日&#xff0c;广东海上丝绸之路文化促进会近日正式批复荐酒师国际认证&#xff08;广州&#xff09;有限公司&#xff0c;成为备受瞩目的“世界酒中国菜”系列活动的指导单位。此举旨在通过双方的…

IDEA中各种Maven相关问题(文件飘红、下载依赖和启动报错)

错误情况 包名、类名显示红色、红色波浪线&#xff0c;大量依赖提示不存在&#xff08;程序包xxx不存在&#xff09; 工程无法启动 一、前提条件 1、使用英文原版IDEA 汉化版的可能有各种奇怪的问题。建议用IDEA英文版&#xff0c;卸载重装。 2、下载maven&#xff0c;配置环…

2024HW|常见红队使用工具

目录 什么是HW&#xff1f; 什么是网络安全红蓝对抗&#xff1f; 红队 常见工具 信息收集工具 Nmap 简介 漏洞扫描工具 Nessus简介 AWVS 简介 抓包工具 Wireshark简介 TangGo 简介 web 应用安全工具 Burpsuite 简介 SQLMap webshell 管理工具 蚁剑 冰蝎 后…

uniapp input点击旁边按钮,如何不失去焦点

有遇到在评论的时候&#xff0c;唤起键盘。旁边的其他按钮&#xff08;匿名、发送等&#xff09;&#xff0c;input会失去焦点。软键盘会隐藏 处理方法: 1、重新获取键盘焦点 &#xff08;通过重置focus状态来处理&#xff09; #页面 用focus变量来动态设置 <input v-mod…

《PNAS》和《Nature Communications》仿章鱼和蜗牛的粘液真空吸附,赋予了机器人吸盘新的“超能力”

想象一下&#xff0c;如果机器人能够像章鱼一样牢牢吸附在粗糙崎岖的岩石上&#xff0c;或者像蜗牛那样在墙面上悠然负重爬行&#xff0c;那会是多么神奇的一幕&#xff01;近日&#xff0c;布里斯托大学机器人实验室的Jonathan Rossiter教授课题组就为我们带来了这样的“超能力…

嵌入式功耗

adb ADB&#xff08;Android Debug Bridge&#xff0c;安卓调试桥&#xff09;是一个多功能的命令行工具&#xff0c;允许用户与运行 Android 的设备进行通信。它是 Android SDK 的一部分&#xff0c;广泛用于开发和调试 Android 应用程序。以下是 ADB 的一些主要功能和使用场景…

Java中的堆(Heap)和栈(Stack):深入解析与对比

在Java的内存管理中&#xff0c;堆&#xff08;Heap&#xff09;和栈&#xff08;Stack&#xff09;是两个至关重要的概念。它们各自扮演着不同的角色&#xff0c;对于理解和编写高效的Java程序至关重要。以下&#xff0c;我们将从技术难点、面试官关注点、回答吸引力和代码举例…

gulp入门1-安装

Gulp 是一个流行的自动化构建工具&#xff0c;主要用于前端开发中的任务自动化&#xff0c;如文件压缩、代码合并、代码校验等。以下是一个 Gulp 的入门教程&#xff0c;帮助你快速上手&#xff1a; 1. 安装 Node.js 和 npm 首先&#xff0c;你需要在你的计算机上安装 Node.j…

教你考研“潜规则”!初试+复试经验分享!

这个系列会邀请上岸学长学姐进行经验分享~ 今天分享经验的同学初试380&#xff0c;上岸中国计量大学。 政治 政治不用开始过早&#xff0c;一般推荐在7-8月开始就可以了&#xff0c;我是七月底开始的&#xff0c;考了72分&#xff0c;选择33分&#xff0c;大题39分。刚开始第…

软考 系统架构设计师系列知识点之杂项集萃(22)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;21&#xff09; 第32题 人口信息采集处理和利用业务属于&#xff08; &#xff09;&#xff0c;营业执照发放属于&#xff08; &#xff09;&#xff0c;户籍管理属于&#xff08; &#xff09;&…