.Net 6.0定义全局当前身份缓存对象

 我们登录后一些必要的用户数据存到Token中,我们只需要在请求头中拿到Token并将它解析出来,再通过数据库查询出来即可,做的好一点可以配合上Redis,但是不用Redis也无伤大雅,当然也会遇到一些小问题,比如HttpContext对象如何获取,我在这里的解决方案是,定义一个静态类然后在请求管道中拿到服务容器,再通过服务容器拿到IHttpContextAccessor服务,再点出HttpContext,再拿到请求头,是不是很简单,那我们就直接步入正题吧!!!各位看官献丑了哈哈哈哈

正题:

1.创建静态类ServiceLocator获取服务容器:

在这里解释一下为什么不直接注入IHttpContextAccessor服务再通过构造函数获取,因为这过程中会有遇到一个问题,在静态类中是不能有构造函数的,如果是直接把这个服务容器拿过来就可以完美的解决这个问题,先不着急在下面会体现(第三和第五点)

1 public static class ServiceLocator
2     {
3         public static IApplicationBuilder? Builder;
4     }

2.在请求管道中赋值

1 var app = builder.Build();
2 ServiceLocator.Builder = app;

3.创建HttpContext类并通过IHttpContextAccessor服务获取HttpContext

1         /// <summary>
2         /// Http上下文对象
3         /// </summary>
4         public static HttpContext HttpContext => ServiceLocator.Builder!
5             .ApplicationServices
6             .GetRequiredService<IHttpContextAccessor>()
7             .HttpContext;

4.创建Jwt帮助类,代码如下:

 1  public static class JwtHelper
 2     {
 3         /// <summary>
 4         /// 解密Token成字典
 5         /// </summary>
 6         /// <returns></returns>
 7         public static Dictionary<string, string> GetTokenValue(string token)
 8         {
 9             var st = new JwtSecurityTokenHandler().ReadJwtToken(token);
10             var claims = st.Claims.ToList();
11             var res = new Dictionary<string, string>();
12             claims.ForEach(d =>
13             {
14                 res.Add(d.Type, d.Value);
15             });
16             return res;
17         }
18 
19     }

5.创建当前身份缓存对象帮助类并将Token中信息解析,并查询响应

 1  public static class CurUserInfoHelper
 2     {
 3         /// <summary>
 4         /// 当前身份缓存对象
 5         /// </summary>
 6         public static SysUserOutputWebDto? CurUserInfo => GetCurUserInfo();
 7 
 8         /// <summary>
 9         /// 获取当前用户身份缓存对象
10         /// </summary>
11         /// <returns></returns>
12         public static SysUserOutputWebDto GetCurUserInfo()
13         {
14             var result = new SysUserOutputWebDto();
15             var httpContext = HttpContextHelper.HttpContext;
16             var headrs = httpContext.Request.Headers;
17             var authorization = headrs["Authorization"];
18             string token = authorization!;
19             if (token.Contains("Bearer"))
20             {
21                 string[] tokenStr = authorization.ToString().Split(' ');
22                 token = tokenStr[1];
23             }
         //解密
24             var claims = JwtHelper.GetTokenValue(token);
25             var userId = claims["UserID"];
26             if (!string.IsNullOrEmpty(userId))
27             {
28                 //非构造函数式注入服务
29                 var serviceScope = ServiceLocator.Builder!.ApplicationServices.CreateScope();
30                 var sysUserEntityBL = serviceScope.ServiceProvider.GetService(typeof(ISysUserEntityBL)) as ISysUserEntityBL;
31 
32                 var sysUser = sysUserEntityBL!.GetSinge(d => d.Id == userId);
33                 result = sysUser.AsOutputWebDto();//Entity转换为输出型Dto
34             }
35             return result;
36         }
37 
38     }

6.直接使用即可

1 var curUser =CurUserInfoHelper.CurUserInfo;

 效果如下图:

 结尾:

  今天的内容承接上篇Jwt加密篇,如果过程中有不清楚或者中断的地方可以回顾下上篇文章,也欢迎私信请教,或者在评论区探讨,本人还是个初入职场的小白如有不足的地方也希望大佬们能及时指出,好啦今天的内容就到这里了哦,如果对你有帮助就点个攒支持一下吧嘻嘻

猜你喜欢

转载自blog.csdn.net/sinat_40572875/article/details/129758311
net
今日推荐