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);
}
相关推荐
山水洛行1 小时前
AI Agent 智能体记忆:从检索到被治理的数据系统
后端
卷无止境1 小时前
C++20 的概念与约束:让模板编程终于"说人话"
后端
Ai拆代码的曹操1 小时前
一次排查三种连接泄漏模式,再也不怕 HikariCP 连接池爆满了
后端
咪库咪库咪1 小时前
Cypher入门
后端
雪隐2 小时前
个人电脑玩AI-08让5060 Ti给你打工——我拿 Unlimited-OCR扫了 600 页书,然后悟了
人工智能·后端
AskHarries2 小时前
用 OpenClaw 做一份完整 PPT:从主题、提纲到 slide deck
后端·程序员
Csvn2 小时前
Linux 常用操作命令合集与运维实战
后端
卷无止境3 小时前
现代C++ 编译器生态及其对编程规范的影响
后端
云技纵横3 小时前
一个 @Async,把 @Transactional 的事务边界打穿了
后端·面试