【发布时间】:2016-09-01 15:29:04
【问题描述】:
我正在做自定义 asp.net 身份,而不是使用 asp.net 内置表。我已成功创建用户并实现自定义 CreateAsync
现在我想用新的加密密码更新用户,所以我不知道如何提供UpdateAsync method 的自定义实现。
这是我的桌子:
用户:Id,Name,EmailId,Password,Statistics,Salary
型号:
public class UserModel : IUser
{
public string Id { get; set; }
public string Name { get; set; }
public string EmailId { get; set; }
public string Password { get; set; }
public int Salary { get; set; }
}
我实现 IUserstore 的自定义类:
public class UserStore : IUserStore<UserModel>, IUserPasswordStore<UserModel>
{
private readonly MyEntities _dbContext;
private readonly HttpContext _httpContext;
// How to implement this method for updating only user password
public Task UpdateAsync(UserModel user)
{
throw new NotImplementedException();
}
public Task CreateAsync(UserModel user)
{
return Task.Factory.StartNew(() =>
{
HttpContext.Current = _httpContext ?? HttpContext.Current;
var user = _dbContext.User.Create();
user.Name = user.Name;
user.EmailId = user.EmailId;
user.EmailAddress = user.Email;
user.Password = user.Password;
_dbContext.Users.Add(dbUser);
_dbContext.SaveChanges();
});
}
public Task SetPasswordHashAsync(UserModel user, string passwordHash)
{
return Task.Factory.StartNew(() =>
{
HttpContext.Current = _httpContext ?? HttpContext.Current;
var userObj = GetUserObj(user);
if (userObj != null)
{
userObj.Password = passwordHash;
_dbContext.SaveChanges();
}
else
user.Password = passwordHash;
});
}
public Task<string> GetPasswordHashAsync(UserModel user)
{
//other code
}
}
控制器:
public class MyController : ParentController
{
public MyController()
: this(new UserManager<UserModel>(new UserStore(new MyEntities())))
{
}
public UserManager<UserModel> UserManager { get; private set; }
[HttpPost]
public async Task<JsonResult> SaveUser(UserModel userModel)
{
IdentityResult result = null;
if (userModel.Id > 0) //want to update user with new encrypted password
result = await UserManager.UpdateAsync(user);
else
result = await UserManager.CreateAsync(userModel.EmailId, userModel.Password);
}
}
【问题讨论】:
-
使用
Task.Factory.StartNew将方法推送到后台线程似乎是个坏主意。要么将方法标记为async并使用await _dbContext.SaveChangesAsync();,要么使方法同步并在最后返回Task.FromResult(true);。 -
可能。即使不是这样,删除
Task.Factory.StartNew也可能更容易看到错误。 -
CreateAsync中还存在变量命名冲突:Task.Factory.StartNew委托中定义的user变量隐藏了user参数。但我怀疑这只是您的问题中的一个错字,因为您随后使用了一个名为dbUser的未定义变量。 :) -
我会避免在
UpdateAsync方法中触摸密码 - AFAIK,这仅用于更新 other 属性。SetPasswordHashAsync方法用于更新密码。
标签: c# asp.net-core asp.net-core-mvc asp.net-core-identity