Asp.net Core 通过依赖注入的方式获取用户
思路:Web项目中,需要根据当前登陆的用户,查询当前用户所属的数据、添加并标识对象等。根据请求头Authorization 中token,获取Redis中存储的用户对象。
本做法需要完成 基于StackExchange.Redis 配置,参考:Asp.Net Core基于StackExchange Redis 缓存-CSDN博客
NuGet安装
Microsoft.AspNetCore.Http.Abstractions
1.接口
public interface IUserService
{Task<OMUserInfo> GetUserInfoAsync(string token);Task<OMUserInfo> GetCurrentUserAsync();
}
2.用户对象
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.实现
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
// 添加HttpContext访问器builder.Services.AddHttpContextAccessor();//注册用户服务// 注册Redis服务(使用之前实现的IRedisService)builder.Services.AddStackExchangeRedisCache(options =>{options.Configuration = builder.Configuration.GetConnectionString("Redis");});builder.Services.AddScoped<IUserService, OMUserService>();
5.控制器中使用
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);
}