Asp.net mvc 5 SetPasswordHashAsync必须在MVC 5中的IPasswordStore中完成哪些工作?

Asp.net mvc 5 SetPasswordHashAsync必须在MVC 5中的IPasswordStore中完成哪些工作?,asp.net-mvc-5,Asp.net Mvc 5,尝试在新的asp.net mvc 5中实现IPasswordStore,我有点不知所措。我想用我自己的ORM 从示例项目中使用“注册”屏幕时运行的脚手架“AccountController”中获取这段熟悉的代码片段 public async Task<ActionResult> Register(RegisterViewModel model) { if (ModelState.IsValid) { var user =

尝试在新的asp.net mvc 5中实现IPasswordStore,我有点不知所措。我想用我自己的ORM

从示例项目中使用“注册”屏幕时运行的脚手架“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);
    }
行首先调用IPasswordStore函数

  public Task SetPasswordHashAsync(TUser user, string passwordHash)
没有先从IUserStore调用

   public Task CreateAsync(TUser user)
如果尚未在数据库中创建用户,如何设置密码哈希?此外,我们甚至不知道是否可以创建提议的“用户”,因为我们还没有检查用户名是否已被使用

   public Task<TUser> FindByNameAsync(string userNameIn)
公共任务FindByNameAsync(字符串userNameIn) 这就是后来所说的


有什么想法吗?

您注意到,在创建用户之前,您可能不应该为用户保留密码哈希。 您可以将密码散列保存到一个位置,如果用户实际上没有创建,该位置将被还原。在创建并存储用户之前,不应存储密码,即在
CreateAsync(TUser user)

EntityFramework实现中的IdentityUser就是这样一个位置,它使您能够在CreateAync方法中存储用户和密码信息。
我不是说你应该引用Identity.EntityFramework程序集,只要说用户对象的用户和密码哈希信息与IdentityUser相似就是一种可能的解决方案。

始终在
IUserPasswordStore.SetPasswordHashAsync
方法体中设置用户对象的密码哈希属性,因为
IUser
接口没有这样定义属性
UserManager
无法设置它。如果执行此操作,然后仅在用户存在时更新用户数据库记录,则可以在最后在
IUserStore.CreateAsync
方法中创建用户时添加密码哈希


这个原则也适用于
IUserSecurityStampStore.SetSecurityStampAsync
方法。

我当时在那里,从Git下载了ASP.NET Identity的源代码,发现:

public virtual async Task<IdentityResult> CreateAsync(TUser user, string password)
        {
            ThrowIfDisposed();
            var passwordStore = GetPasswordStore();
            if (user == null)
            {
                throw new ArgumentNullException("user");
            }
            if (password == null)
            {
                throw new ArgumentNullException("password");
            }
            var result = await UpdatePasswordHash(passwordStore, user, password);
            if (!result.Succeeded)
            {
                return result;
            }
            return await CreateAsync(user);
        }
公共虚拟异步任务CreateAsync(用户,字符串密码)
{
ThrowIfDisposed();
var passwordStore=GetPasswordStore();
if(user==null)
{
抛出新的ArgumentNullException(“用户”);
}
如果(密码==null)
{
抛出新的ArgumentNullException(“密码”);
}
var result=await UpdatePasswordHash(密码存储、用户、密码);
如果(!result.successed)
{
返回结果;
}
返回等待CreateAsync(用户);
}
如果您提供自己的解决方案,那么至少一个解决方案应该和“开箱即用”解决方案一样安全。当我实现我的函数时,我查看了每个函数,并用我自己的数据层和类实现了我自己的函数

我最终实现了一些otherwize没有的代码,关于用户密码的散列,我使用了类似的东西
. 称我为偏执狂,不喜欢在我的密码中使用默认的salt…

只要将它存储在我的IUserStore实现中的临时字典中,如果用户还不存在的话。行得通。有人能解释一下为什么他们这样定义行为吗?一定有原因。。。否则看起来有点奇怪。@Matt Howlett:同意,至少应该有一些IUserPasswordStore.SetPasswordHashAsync()方法的文档。这里的差距很大。如果没有持久化,为什么要异步呢?
public virtual async Task<IdentityResult> CreateAsync(TUser user, string password)
        {
            ThrowIfDisposed();
            var passwordStore = GetPasswordStore();
            if (user == null)
            {
                throw new ArgumentNullException("user");
            }
            if (password == null)
            {
                throw new ArgumentNullException("password");
            }
            var result = await UpdatePasswordHash(passwordStore, user, password);
            if (!result.Succeeded)
            {
                return result;
            }
            return await CreateAsync(user);
        }