Asp.net Core 通过依赖注入的方式获取用户

思路:Web项目中,需要根据当前登陆的用户,查询当前用户所属的数据、添加并标识对象等。根据请求头Authorization 中token,获取Redis中存储的用户对象。

本做法需要完成 基于StackExchange.Redis 配置,参考:Asp.Net Core基于StackExchange Redis 缓存-CSDN博客

NuGet安装

Microsoft.AspNetCore.Http.Abstractions

1.接口

cs 复制代码
public interface IUserService
{
    Task<OMUserInfo> GetUserInfoAsync(string token);
    Task<OMUserInfo> GetCurrentUserAsync();
}

2.用户对象

cs 复制代码
public class OMUserInfo
{
    public Guid UId { get; set; }
    public string UName { get; set; }
    public string TrueName { get; set; }
    public string Mobile { get; set; }
    public bool IsAdmin { get; set; }
    public string Department { get; set; }
    public string UType { get; set; }
    public string OId { get; set; }
    public string Token { get; set; }
    public DateTime ExpireDateTime { get; set; }
}

3.实现

cs 复制代码
public class OMUserService : IUserService
{
    private readonly IRedisService _redisService;
    private readonly IHttpContextAccessor _httpContextAccessor;

    public OMUserService(IRedisService redisService,IHttpContextAccessor httpContextAccessor)
    {
        _redisService = redisService;
        _httpContextAccessor = httpContextAccessor;
    }

    public async Task<OMUserInfo> GetCurrentUserAsync()
    {
        var token = GetTokenFromHeader();
        if (string.IsNullOrEmpty(token))
            return null;

        return await GetUserInfoAsync(token);
    }

    public async Task<OMUserInfo> GetUserInfoAsync(string token)
    {
        var userKey = $"user:{token}";
        return await _redisService.StringGetAsync<OMUserInfo>(userKey);
    }

    private string GetTokenFromHeader()
    {
        var authHeader = _httpContextAccessor.HttpContext?
            .Request.Headers["Authorization"].ToString();

        return authHeader?.Replace("Bearer ", "", StringComparison.OrdinalIgnoreCase);
    }
}

4.注入

Asp.Net Core项目Nuget添加 Microsoft.Extensions.Caching.StackExchangeRedis

cs 复制代码
 // 添加HttpContext访问器
 builder.Services.AddHttpContextAccessor();
 //注册用户服务
 // 注册Redis服务(使用之前实现的IRedisService)
 builder.Services.AddStackExchangeRedisCache(options =>
 {
     options.Configuration = builder.Configuration.GetConnectionString("Redis");
 });

 builder.Services.AddScoped<IUserService, OMUserService>();

5.控制器中使用

cs 复制代码
private readonly IRedisService _redis;
private readonly IUserService _userService;
public TestController(IRedisService redis, IUserService userService) 
{
    _redis = redis;
    _userService = userService;
}

[HttpGet("string")]
public async Task<IActionResult> TestString()
{
    var user = await _userService.GetCurrentUserAsync();

    Console.WriteLine(user.TrueName);

    await _redis.StringSetAsync("anna","多慢慢");
    var result = await _redis.StringGetAsync<string>("anna");
    return Ok(result);
}
相关推荐
用户83562907805121 分钟前
使用 Python 合并 PowerPoint 演示文稿
后端·python
掘金者阿豪1 小时前
数据同步软件技术实践:从异构数据库迁移到实时数据流转,解析电科金仓KFS架构设计
后端
ServBay1 小时前
不会写代码,如何搭建自己的 AI 自动化工作流
后端·aigc·ai编程
天远大数据1 小时前
从调用账单到业务回执:Agent单位成本核算实践
人工智能·后端
沐言人生1 小时前
又一个神级考公脑库-22,375篇真题终于按考点整理了
后端·面试
xn71331 小时前
EmbeddingGemma 2 270M 实测:278 Chunk、32 个查询与 RRF 反例
人工智能·后端·架构
丨只要微微辣1 小时前
从前端到后端:第一次把项目部署 上云的完整实战(含踩坑实录)
后端
newerp1 小时前
Execution Trace 深入实战:可视化调度与系统停顿分析
后端·程序员·go
Lambert2812 小时前
SAA 停摆的答案:前团队的 ARGI 我上手跑了一遍,缝了三针才跑通
后端·openai·ai编程
轻舟技术A2 小时前
Pi 的 Rust 实现来了:rpi,不止一个终端 Agent
开发语言·后端·rust