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

前言

妙菡小说网 https://www.ouqu.info

在增删改查中的增和改操作中,我们经常需要更新数据流的创建人和修改人,无论我们项目是基于DDD,抑或是简单仅有服务层,此时我们都需要获取用户信息,那么我们只能将用户标识从控制器层层传递到服务或仓储层?鉴于如上场景很常见,难道我们没发觉这样做很是繁琐吗?于是乎,我们想要解放生产力,下面咱们来聊聊我个人的想法

全局获取用户信息

既然是全局获取用户信息,难道是定义静态变量?怎么可能,当然是基于请求而获取,基于静态变量必然存在多个用户请求覆盖信息的情况,那我们到底应该怎么全局获取?首先我们想到的过滤器比如ActionFilter...等等,但要是我们需要进行异步操作呢?貌似又不可行,根据我查询官方文档,没搞错的话,应该是从1.0开始就给出了异步过滤器,那就是IAsyncActionFilter,此方法不同于ActionFilter的是,它能够处理异步操作,同时它是在模型绑定完成之后执行,也就是只有一个异步方法

public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
    await next();
}

接下来我们定义全局用户会话类,如下:

public class Session
{
    /// <summary>
    /// 用户id
    /// </summary>
    public string UserId { get; set; }
    /// <summary>
    /// 用户名
    /// </summary>
    public string UserName { get; set; }
}

紧接着,比如项目我们使用JWT,则拿到声明中用户标识和用户账号,那么我们接下来我们只需要实现上述异步action过滤器接口即可,如下:

public class AsyncSessionFilter : IAsyncActionFilter
{
    private readonly Session _session;
 
    public AsyncSessionFilter(Session session)
    {
        _session = session;
    }
    
    public async Task OnActionExecutionAsync(
      ActionExecutingContext context,
      ActionExecutionDelegate next)
    {
        var user = context.HttpContext.User;

        _session.UserId = user.FindFirst(JwtRegisteredClaimNames.Sub)?.Value;

        _session.UserName = user.FindFirst(JwtRegisteredClaimNames.UniqueName)?.Value;

        await next();
    }
}

最后,则很简单的进行上述接口实现和会话注入,如下:

//注册用户会话
services.AddScoped<Session>();
   
//注册全局过滤器   
services.AddControllers(options =>
{
   options.Filters.Add<AsyncSessionFilter>();
})

在实际使用中,我们只需要在仓储或服务层构造函数使用Session,即可拿到用户名和用户id,从而最终解决对于新增和更改操作处理操作人信息

总结

💡 在.NET Core中借助实现异步IAsyncActionFilter接口而实现全局获取用户信息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目基于.NET 4.5构建,语法版本C#6.0,包含日常编程多数的常用封装,可以说是一个万能框架,能够用于任何基于.NET平台的项目当中。 功能主要覆盖: 数据库操作:内存表操作、关系实体映射等; 日期时间常用操作:农历操作、时间戳操作,时分秒转换等; 文件操作:大文件操作、文件压缩与解压、ini配置文件操作; 硬件操作:获取电脑各个硬件的性能指标; Html操作:利用C#对html字符串进行“dom”操作,html的XSS净化、html标签操作; 日志组件:高并发可用的高性能日志记录; 多媒体文件操作:图片的各种处理; 网络操作:获取线程内唯一对象、Session和Cookie的扩展、获取IP地址详细信息、缓存操作; Nosql:仅封装了Redis的常用操作,mongodb的操作类客户端独立分开了; 反射操作:各种对对象的字段属性和方法的快捷方式; 加密安全:对字符串进行的扩展,包含AES、DES、MD5、hash、SHA1、加盐等; 字符串扩展:包含验证码生成、各种与字符串相关的扩展; Win32API:包含于Windows系统接口相关的操作封装; 全局扩展:包含字符串扩展,类型转换,委托、循环操作、异步操作、正则等。 用法 1.检验字符串是否是Email bool isEmail = "[email protected]".MatchEmail(); 2.获取CPU核心数 int core = SystemInfo.GetCpuCount(); 3.大文件操作 FileStream fs = new FileStream(@"D:\boot.vmdk", FileMode.OpenOrCreate, FileAccess.ReadWrite); { //fs.CopyToFile(@"D:\1.bak");//同步复制大文件 fs.CopyToFileAsync(@"D:\1.bak"); //异步复制大文件 string md5 = fs.GetFileMD5Async().Result; //异步获取文件的MD5 } 4.html的防XSS处理: string html = @"<link href='/Content/font-awesome/css' rel='stylesheet'/> <!--[if IE 7]> <link href='/Content/font-awesome-ie7.min.css' rel='stylesheet'/> <![endif]--> [removed][removed] <form action='/packages' method='get'> 退出 <input name='q' id='searchBoxInput'/> <input id='searchBoxSubmit' type='submit' value='Submit' /> </form> "; string s = html.HtmlSantinizerStandard(); //清理后:退出 5.整理操作系统的内存: Windows.ClearMemorySilent();

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值