停止AspNet Identity在验证错误后存储电子邮件地址

时间:2016-12-13 01:49:00

标签: c# entity-framework-6 asp.net-identity-2

我有一个服务器从旧系统中获取用户列表并同步我的AspNet Identity数据库。使用UserManager.SetEmail(string userId, string email)更新用户的电子邮件地址时出现问题,验证失败。 UserStore中的用户对象保留无效电子邮件地址的值。我停止处理该用户并跳到列表中的下一个用户。稍后当我的服务找到要创建的新用户时,我使用UserManager.Create(ApplicationUser user)并更新数据库,包括所有未完成的更改,包括现有用户的无效电子邮件地址。

有没有办法阻止无效的电子邮件地址被保留?这是一个错误还是我没有正确使用它?我是否应该在任何更新之前手动备份每个对象,如果IdentityResult有错误,则还原所有值?

//get LegacyUsers
foreach (AppUser appUser in LegacyUsers){
    var user = UserManager.FindByName(appUser.userName);
    if (user != null){
        If (!user.Email.Equals(appUser.Email)){
            var result = UserManager.setEmail(user.Id, appUser.Email)
            if (!result.Succeeded){
                //user object still has new value of email despite error, but not yet persisted to DB.
                Log.Error(…);
                continue;
            }
        }
    }
    else 
    {
        ApplicationUser newUser = new ApplicationUser{
            UserName = appUser.userName,
            //etc
        }
        var result = UserManager.Create(newUser);  //DB updates first user with new email aswell as inserting this new user 
        if (!result.Succeeded){
            Log.Error(…);
            continue;
        }
    }
}

我正在使用Microsoft.AspNet.Identity.Core和Microsoft.AspNet.Identity.EntityFramework的2.2.1.40403版本

1 个答案:

答案 0 :(得分:0)

这种情况正在发生,因为当SaveChanges()方法调用UserManager.Create()方法时,EF会跟踪模型并更新所有修改过的对象。您可以轻松地从DbContext中分离出包含无效电子邮件的用户:

// first get DbContext from the Owin.
var context = HttpContext.GetOwinContext().Get<ApplicationDbContext>();

foreach (AppUser appUser in LegacyUsers){
    var user = UserManager.FindByName(appUser.userName);
    if (user != null){
        If (!user.Email.Equals(appUser.Email)){
            var result = UserManager.setEmail(user.Id, appUser.Email)
            if (!result.Succeeded){                
                Log.Error(…);
                // detach the user then proceed to the next one 
                context.Entry(user).State = EntityState.Detached;
                continue;
            }
        }
    }
    else{
        // rest of the code
    }
}