2015-11-02 56 views
0

我是Adam Freeman书籍的忠实粉丝。在他的Pro Asp.net mvc 5平台的第13章第325页中,下面的代码让我困惑。有没有人有解释为什么他明确地使用电子邮件和密码验证?Microsoft.AspNet.Identity中的显式密码和电子邮件验证,为什么需要?

呼叫this.UserManager.UpdateAsync(user)应返回this.UserManager.UserValidator.ValidateAsync(user)this.UserManager.PasswordValidator.ValidateAsync(password)生成的相同错误的结果。他不是两次做同样的事吗?或者有一个特殊的目的?

[HttpPost] 
    public async Task<ActionResult> Edit(string id, string email, string password) 
    { 
     AppUser user = await this.UserManager.FindByIdAsync(id); 
     if (user != null) 
     { 
      user.Email = email; 
      IdentityResult validEmail = await this.UserManager.UserValidator.ValidateAsync(user); 
      if (!validEmail.Succeeded) 
      { 
       this.AddErrorsFromResult(validEmail); 
      } 

      IdentityResult validPass = null; 
      if (password != string.Empty) 
      { 
       validPass = await this.UserManager.PasswordValidator.ValidateAsync(password); 
       if (validPass.Succeeded) 
       { 
        user.PasswordHash = this.UserManager.PasswordHasher.HashPassword(password); 
       } 
       else 
       { 
        this.AddErrorsFromResult(validPass); 
       } 
      } 

      if ((validEmail.Succeeded && validPass == null) 
       || (validEmail.Succeeded && password != string.Empty && validPass.Succeeded)) 
      { 
       IdentityResult result = await this.UserManager.UpdateAsync(user); 
       if (result.Succeeded) 
       { 
        return this.RedirectToAction("Index"); 
       } 

       this.AddErrorsFromResult(result); 
      } 
     } 
     else 
     { 
      ModelState.AddModelError(string.Empty, "User not found"); 
     } 

     return this.View(user); 
    } 

private AppUserManager UserManager 
    { 
     get 
     { 
      return HttpContext.GetOwinContext().GetUserManager<AppUserManager>(); 
     } 
    } 
private void AddErrorsFromResult(IdentityResult result) 
    { 
     foreach (string error in result.Errors) 
     { 
      ModelState.AddModelError(string.Empty, error); 
     } 
    } 
+2

嗯,唯一真正能够回答的人是亚当弗里曼,不是吗?很可能,在书中有一些联系信息,所以我建议直接与他联系。 –

回答

1
身份的UserManager类UpdateAsync方法的源代码

是这样的:

public virtual async Task<IdentityResult> UpdateAsync(TUser user) 
     { 
      ThrowIfDisposed(); 
      if (user == null) 
      { 
       throw new ArgumentNullException("user"); 
      } 

      var result = await UserValidator.ValidateAsync(user).ConfigureAwait(false); 
      if (!result.Succeeded) 
      { 
       return result; 
      } 
      await Store.UpdateAsync(user).ConfigureAwait(false); 
      return IdentityResult.Success; 
     } 

调用UserValidator.ValidateAsync(user)方法用于验证用户名不违法或用户不具有不同的所有者之前注册的标识并执行不关心验证电子邮件地址或密码字符串。如果您想验证密码并执行自定义检查,则必须创建自定义验证器。 你可以找到Default UserValidator source code here

相关问题