.Net 6.0定義全域性當前身份快取物件

2023-03-24 18:00:23

背景:

  當前身份快取物件顧名思義就是:當前登入的使用者身份物件,那它解決了什麼問題呢?其實在我們日常開發過程中經常能用的到幾乎是必備的,就比如我給某個表插入資料時需要建立人或者一些許可權的存取,都得用到當前身份快取物件,當然啦今天的部落格就是因為我們公司研發部門剛成立不久所以導致很多專案不完善,我在開發過程中就遇到了沒有當前身份快取物件的問題,開發極其不方便啊哈哈,所以我打算自己整一個,所以就有了今天的這篇文章,希望在對螢幕前的你也有所幫助!!

思路:

  我們登入後一些必要的使用者資料存到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加密篇,如果過程中有不清楚或者中斷的地方可以回顧下上篇文章,也歡迎私信請教,或者在評論區探討,本人還是個初入職場的小白如有不足的地方也希望大佬們能及時指出,好啦今天的內容就到這裡了哦,如果對你有幫助就點個攢支援一下吧嘻嘻