ABP Vnext 批量导入用户,解决密码加密问题

因为ABP Vnext在密码加密方面使用的盐加密的方式,底层的加密方式让人摸不着头脑。如何需要批量导入用户的时候,这个密码问题就很头疼。

假设,已经有一个集合List<entity>的用户数据了,此时进行循环取出一条用户信息,进行 abpUser实体的转换。代码如下.

            //判断密码字段是否为空            if (string.IsNullOrEmpty(entity.PasswordHash))            {                entity.Remark = "密码不能为空";                entityRepeatList.Add(entity);                continue;            }            //这是扩展字段的信息,如果没有可以删除            entity.SetProperty("EmpNo", entity.EmpNo);            entity.SetProperty("WeChat", entity.WeChat);                        await _identityOptions.SetAsync();            //UsersInfoDto 自己模仿着 IdentityUser 写一个            var user = ObjectMapper.Map<UsersInfoDto, Volo.Abp.Identity.IdentityUser>(entity);            entity.PasswordHash = _passwordHasher.HashPassword(user, entity.PasswordHash);
            var userPasswordHash = ObjectMapper.Map<UsersInfoDto, Volo.Abp.Identity.IdentityUser>(entity);            await _identityUserRepository.InsertAsync(userPasswordHash);            //此时插入数据,并不立即生效,没有触发savachange(),本接口遍历完毕,才触发保存,所以不用担心每次重复打开关闭连接池的问题

用到的构造函数如下:

 private readonly IOptions<IdentityOptions> _identityOptions; private readonly IPasswordHasher<Volo.Abp.Identity.IdentityUser> _passwordHasher;

最重要的一点是,using引用命名空间的时候,优先选择 Volo.Abp.xxx的命名,不要选择using Microsoft.AspNetCore.Identity....微软自带的,因为abp默认继承了Microsoft,会造成代码冲突。