gpt4 book ai didi

.Net6.0定义全局当前身份缓存对象

转载 作者:我是一只小鸟 更新时间:2023-03-24 22:31:40 25 4
gpt4 key购买 nike

背景:

  当前身份缓存对象顾名思义就是:当前登录的用户身份对象,那它解决了什么问题呢?其实在我们日常开发过程中经常能用的到几乎是必备的,就比如我给某个表插入数据时需要创建人或者一些权限的访问,都得用到当前身份缓存对象,当然啦今天的博客就是因为我们公司研发部门刚成立不久所以导致很多项目不完善,我在开发过程中就遇到了没有当前身份缓存对象的问题,开发极其不方便啊哈哈,所以我打算自己整一个,所以就有了今天的这篇文章,希望在对屏幕前的你也有所帮助!.

思路:

  我们登录后一些必要的用户数据存到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加密篇,如果过程中有不清楚或者中断的地方可以回顾下上篇文章,也欢迎私信请教,或者在评论区探讨,本人还是个初入职场的小白如有不足的地方也希望大佬们能及时指出,好啦今天的内容就到这里了哦,如果对你有帮助就点个攒支持一下吧嘻嘻 。

最后此篇关于.Net6.0定义全局当前身份缓存对象的文章就讲到这里了,如果你想了解更多关于.Net6.0定义全局当前身份缓存对象的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com