Я использую пользовательский идентификатор 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);
в конце. - person Richard Deeming   schedule 01.09.2016Task.Factory.StartNew
может упростить просмотр ошибки. - person Richard Deeming   schedule 01.09.2016CreateAsync
: переменнаяuser
, определенная в делегатеTask.Factory.StartNew
, скрывает параметрuser
. Но я подозреваю, что это просто опечатка в вашем вопросе, так как вы используете неопределенную переменную с именемdbUser
. :) - person Richard Deeming   schedule 01.09.2016UpdateAsync
- насколько я знаю, это только для обновления других свойств. МетодSetPasswordHashAsync
используется для обновления пароля. - person Richard Deeming   schedule 01.09.2016