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

news2024/11/25 17:21:46

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.Claims
                    where item.Type == ClaimType
                    select 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 == ClaimType
                select item.Value).ToList();

    }

    #region MyRegion 拓展

    public int userId => GetClaimValueByType("userId").FirstOrDefault().ObjToInt();//账号id
    public 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.coloradmin.cn/o/1709287.html

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

相关文章

Round-Robin 调度逻辑算法

Round-Robin 调度逻辑算法 1 Intro1.1 固定优先级1.2 Round-Robin算法 之前上学还是工作&#xff0c;都接触过调度算法&#xff1a;Round-Robin和weight-Round Robin算法&#xff0c;但只知道它的功能和目的是什么&#xff0c;没有具体了解如何实现的&#xff1b; 现在是工作上…

【漏洞复现】用友NC registerServlet JNDI 远程代码执行漏洞(XVE-2024-10248)

0x01 产品简介 用友NC是 用友软件股份有限公司开发的一套企业级管理软件系统。它是一个基于互联网的多层应用系统&#xff0c;旨在为中大型企业提供全面、集成的管理解决方案。是一种商业级的企业资源规划云平台&#xff0c;为企业提供全面的管理解决方案&#xff0c;包括财务…

什么情况下JVM内存中的一个对象会被垃圾回收?

什么情况下JVM内存中的一个对象会被垃圾回收? 1、什么时候会触发垃圾回收?2、被哪些变量引用的对象是不能回收的?3、Java中对象不同的引用类型4、finalize()方法的作用1、什么时候会触发垃圾回收? 平时我们系统运行创建的对象都是优先分配在新生代里的,如图: 然后如果…

技术驱动未来,全面揭秘 Sui 的生态发展和布局

在不到一年的时间里&#xff0c;由 Mysten Labs 团队创立的 Layer1 区块链 Sui 迅速崛起&#xff0c;成功跃升至去中心化金融&#xff08;DeFi&#xff09;的前十名。根据 DeFi Llama 的数据&#xff0c;Sui的总锁定价值&#xff08;TVL&#xff09;在短短四个月内增长超过 100…

java第十八课 —— 重载、可变参数

方法重载 基本介绍 java 中允许同一个类中&#xff0c;多个同名方法的存在&#xff0c;但要求形参列表不一致&#xff01; 比如&#xff1a;System.out.println(); out 是 PrintStream 类型 重载的好处 减轻了起名的麻烦减轻了记名的麻烦 注意事项和使用细节 方法名&…

登录记住密码背景颜色修改

1&#xff0c;在login.vue中&:-webkit-autofill里面的css替换成如下 &:-webkit-autofill {box-shadow: 0 0 0px 1000px $bg inset !important;-webkit-text-fill-color: $cursor !important;}

scp问题:Permission denied, please try again.

我把scp归纳三种情况&#xff1a; 源端root——》目标端root 源端root——》目标端mysql&#xff08;任意&#xff09;用户 源端&#xff08;任意用户&#xff09;——》目标端root用户 在scp传输文件的时候需要指导目标端的用户密码&#xff0c;如root用户密码、mysql用户…

拖线无人机技术:像风筝一样飞行,无人能干扰

拖线无人机技术是一种独特且高效的无人机应用技术&#xff0c;其设计理念源于风筝。这种无人机不仅能够在空中稳定飞行&#xff0c;而且具备极强的抗干扰能力&#xff0c;使其在各种复杂环境下都能保持通信畅通和任务执行的高效。 拖线无人机技术的核心在于其拖线系统。与传统的…

【高校科研前沿】湖北工业大学为第一署名单位在《Science》发表Letters文章:应对青藏高原河流泥沙激增

文章简介 论文名称&#xff1a;Combating sediment surge in Tibetan rivers&#xff08;应对青藏高原河流泥沙激增&#xff09; 相关作者及单位&#xff1a;杨洪教授&#xff08;英国雷丁大学&#xff09;&刘德富教授&#xff08;湖北工业大学&#xff09;&Julian R…

vite+js配置

vite js 配置路径 npm install types/node --save-dev vite.config.js import { defineConfig } from vite import vue from vitejs/plugin-vue //需要引入 import path from path// https://vitejs.dev/config/ export default defineConfig({plugins: [vue()],resolve: {a…

sql注入利用group_concat函数

1.group_concat函数的作用&#xff1a; 首先根据group by指定的列进行分组&#xff0c;将同一组的列显示出来&#xff0c;并且用分隔符分隔。 2.group_concat运用 这里我使用的是sqllab-less1&#xff0c;通过对数据库的查询&#xff0c;我们发现数据库表名&#xff0c;列名&a…

大模型日报|今日必读的 5 篇大模型论文

大家好&#xff0c;今日必读的大模型论文来啦&#xff01; 1.Meta 领衔&#xff1a;一文读懂视觉语言建模&#xff08;VLM&#xff09; 人们正在尝试将大型语言模型&#xff08;LLMs&#xff09;扩展到视觉领域。从可以引导我们穿越陌生环境的视觉助手&#xff0c;到仅使用高…

“2024 亚马逊云科技中国峰会,挑战俱乐部 Hands On 动手实验课程正在直播中,点击链接畅享生成式AI建构之旅,赢心动好礼

只看不过瘾&#xff1f;别急&#xff01;我们为您准备了【生成式AI助手 Amazon Q 初体验】动手实验&#xff0c;一款生成式人工智能 (AI) 支持的对话助理&#xff0c;可以帮助您理解、构建、扩展和操作 Amazon 应用程序&#xff0c;您可以询问有关 Amazon 架构、最佳实践、文档…

AD使用问题

设计流程&#xff1a; 1.先创建项目——添加原理图&#xff0c;原理图库&#xff0c;PCB&#xff0c;PCB库 2.画原理图库和封装库 主要有三种方法&#xff1a; &#xff08;1&#xff09;手动画库和封装&#xff0c;常常用于嘉立创查询不到的器件 &#xff08;2&#xff0…

29【PS 作图】宫灯 夜景转换

夜景转化 1 原图 2 选中要变换的图层,然后点击“颜色查找” 再3DLUT文件中,选择moonlight.3DL,可以快速把图层变成偏夜景的颜色 结果如下: 3 选择“曲线” 把曲线 右边往上调【亮的更亮】,左边往下调【暗的更暗】 4 添加灯光 新建一个图层

VBA技术资料MF158:获取系统的用户名

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

为什么会有websocket(由来)

一、HTTP 协议的缺点和解决方案 1、HTTP 协议的缺点和解决方案 用户在使用淘宝、京东这样的网站的时候&#xff0c;每当点击一个按钮其实就是发送一个http请求。那我们先来回顾一下http请求的请求方式。 一个完整的http请求是被分为request请求节点和response响应阶段的&…

芯片固定uv胶有什么优点?

芯片固定uv胶有什么优点&#xff1f; 芯片固定UV胶具有多种优点&#xff0c;这些优点使得它在半导体封装和芯片固定等应用中成为理想的选择。以下是芯片固定UV胶的一些主要优点&#xff1a; 固化速度快&#xff1a;UV胶在紫外线照射下能迅速固化&#xff0c;通常在几秒到几十秒…

论文阅读 - TIME-LLM: TIME SERIES FORECASTING BY REPROGRAMMING LARGE LANGUAGE MODELS

论文链接&#xff1a; https://arxiv.org/abs/2310.01728 目录 摘要 1 INTRODUCTION 2 RELATED WORK 3 METHODOLOGY 3.1 MODEL STRUCTURE 4 MAIN RESULTS 4.1 长期预测 4.2 短期预测 4.3 FEW-SHOT FORECASTING 5 CONCLUSION AND FUTURE WORK 摘要 动机&#xff1a; 时…

基于语音识别的智能电子病历(三)之 Soniox

Soniox成立于2020年&#xff0c;目前总部位于美国加州福斯特城&#xff0c;该公司开发了市场上最好的语音识别引擎之一。该公司目前提供市面上领先的云转录引擎之一——这也是audioXpress成功用于采访和一般语音转文本转换的引擎。 专注于语音AI的Soniox在2021年推出了世界上第…