当前位置: 首页 > 科技观察

.NETCore如何全局获取用户信息?

时间:2023-03-11 22:23:12 科技观察

既然上面的场景很常见,我们这样做是不是觉得很麻烦呢?所以,我们要解放生产力,下面谈谈我个人的想法。既然全局获取用户信息就是全局获取用户信息,那么是不是要定义静态变量呢?这怎么可能?当然,它是根据请求获得的。基于静态变量,必然存在多个用户请求覆盖信息的情况。那么我们应该如何在全球范围内获取它呢?首先我们想到ActionFilter...等过滤器,但是如果我们需要进行异步操作呢?好像不太可行。根据我查询官方文档,如果没记错的话,应该是从1.0开始的异步过滤器,即IAsyncActionFilter,这个方法和ActionFilter不同的是可以处理异步操作,是在modelbinding完成之后执行的,即只有一种异步方法。publicasyncTaskOnActionExecutionAsync(ActionExecutingContextcontext,ActionExecutionDelegatenext){awaitnext();}接下来我们定义全局用户会话类,如下:publicclassSession{///

///userid///publicstringUserId{get;set;}//////Username///publicstringUserName{get;set;}}紧接着,比如我们项目使用JWT,就会得到用户ID和用户账号在声明中,我们将继续进行我们我们只需要实现上述上述上述上述过滤器接口接口即即即即即即接口接口接口即过滤器过滤器接口接口:publisClassAsyncSsessionFilter:iasyncactionfilter{iasyncactionfilter{privatereadonlysession_session_session;privateReadonlySession;prublicSessionseectFilter(sessesions)HttpContext.User;_session.UserId=user.FindFirst(JwtRegisteredClaimNames.Sub)?.Value;_session.UserName=user.FindFirst(JwtRegisteredClaimNames.UniqueName)?.Value;awaitnext();}}最后实现起来很简单上面的接口和sessioninjection,如下://注册用户会话services.AddScoped();//注册全局过滤器services.AddControllers(options=>{options.Filters.Add();})在实际使用中,我们只需在存储层或服务层构造函数中使用Session获取用户名和用户id即可,最终解决增改操作的操作员信息处理问题。这样是不是更方便简洁?在.NETCore中通过实现异步IAsyncActionFilter接口实现全局获取用户信息