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