因为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,会造成代码冲突。