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);
}
相关推荐
xiaobaoyu36 分钟前
ssm知识点梳理
后端
IT_陈寒1 小时前
Vite的public文件夹放静态资源?这坑我替你踩了
前端·人工智能·后端
浮游本尊1 小时前
合同同步逻辑
后端
子兮曰1 小时前
别让爬虫白嫖你的导航站了:纯免费,手把手实现加密字体防爬
前端·javascript·后端
阿苟1 小时前
JAVA重点难点
后端
uzong2 小时前
TIOBE 指数:2026 年编程语言排行榜
后端
小村儿2 小时前
连载06 - Hooks 源码深度解析:Claude Code 的确定性自动化体系
前端·后端·ai编程
用户8356290780512 小时前
使用 Python 设置 Excel 数据验证
后端·python
yoyo_zzm2 小时前
Laravel6.x新特性全解析
java·spring boot·后端
xiaobaoyu2 小时前
ssm
后端