Asp.net mvc 5 SetPasswordHashAsync必须在MVC 5中的IPasswordStore中完成哪些工作?
尝试在新的asp.net mvc 5中实现IPasswordStore,我有点不知所措。我想用我自己的ORM 从示例项目中使用“注册”屏幕时运行的脚手架“AccountController”中获取这段熟悉的代码片段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 =
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);
}