SetPasswordHashAsync在MVC 5中的IPasswordStore中必须完成的所有事情是什么?

Isa*_*ger 8 asp.net-mvc-5

尝试在新的asp.net mvc 5中实现IPasswordStore,我有点沮丧.我想使用自己的ORM.

从示例项目中使用'register'屏幕时运行的脚手架'AccountController'中获取这个熟悉的代码片段.

public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser() { UserName = model.UserName };
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                await SignInAsync(user, isPersistent: false);
                return RedirectToAction("Index", "Home");
            }
            else
            {
                AddErrors(result);
            }
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }
Run Code Online (Sandbox Code Playgroud)

  var result = await UserManager.CreateAysnc(user, model.Password)
Run Code Online (Sandbox Code Playgroud)

line首先调用IPasswordStore函数

  public Task SetPasswordHashAsync(TUser user, string passwordHash)
Run Code Online (Sandbox Code Playgroud)

没有先从IUserStore调用

   public Task CreateAsync(TUser user)
Run Code Online (Sandbox Code Playgroud)

如果尚未在db中创建用户,如何设置密码哈希?此外,我们实际上甚至不知道我们是否可以创建提议的"用户",因为我们还没有检查是否已使用用户名

   public Task<TUser> FindByNameAsync(string userNameIn)
Run Code Online (Sandbox Code Playgroud)

之后被称为.

有任何想法吗?

Ola*_*ybø 2

您正确地注意到,您可能不应该在创建用户之前保留用户的密码哈希。您可以将密码哈希保存到一个位置,如果实际上并未创建用户,该位置将被恢复。在创建并存储用户之前不应存储密码,即在CreateAsync(TUser user).

EntityFramework 实现中的 IdentityUser 就是这样一个位置,它使您能够在 CreateAsync 方法中存储用户和密码信息。我并不是说您应该引用 Identity.EntityFramework 程序集,只是说具有类似于 IdentityUser 的 User 和 PasswordHash 信息的 User 对象是一种可能的解决方案。

  • 有人可以解释为什么他们这样定义行为吗?一定是有原因的……不然的话就显得有点奇怪了。 (5认同)