2016-09-01 4 views
2

Я делаю идентичность пользовательских asp.net и не используя asp.net встроенные tables успешно создал пользователь с реализацией пользовательских CreateAsyncКак предоставить пользовательскую реализацию метода UpdateAsync идентификатора asp.net?

Теперь я хочу, чтобы обновить пользователь с новым зашифрованным паролем и поэтому я не получаю, как обеспечить пользовательскую реализацию 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); 
    }   
} 
+2

Использование 'Task.Factory.StartNew' для толкания метода на фоновый поток кажется плохой идеей. Либо отметьте методы как 'async' и используйте' await _dbContext.SaveChangesAsync(); 'или сделайте методы синхронными и верните' Task.FromResult (true); 'в конце. –

+0

@richard deeming Большое спасибо за очень приятное предложение. Я действительно ценю это. Иногда мне приходится сталкиваться с проблемой, например, когда я отлаживаю этот код, а затем звоню никогда не вернусь назад. Это из-за этой задачи.factory.new ?? –

+1

Возможно. И даже если это не так, удаление «Task.Factory.StartNew» может облегчить просмотр ошибки. –

ответ

2

Не уверен, если это то, что ищет ...

 public Task UpdateAsync(UserModel model) 
    { 
     return Task.Factory.StartNew(() => 
     { 
      var user = _dbContext.User.Find(x => x.id == model.id); 

      user.Password = model.Password; 
      _dbContext.SaveChanges(); 
     }); 
    } 

Это будет получить конкретную запись и обновить пароль, а затем сохранить запись.

Редактировать

Поскольку пароль не получает зашифрован я добавил код, чтобы взять эту строку и оставить модель, как это, этот метод расширения шифрует значение пароля, я не проверить это, но я я уверен, что это сработает.

user.Password = model.Password.EncryptPassword(EncryptKey); 

Extension methods to encrypt password

+0

Вы можете сохранить любое значение из своей модели. –

+0

Но вот мой вопрос: будет ли пароль зашифрован идентификатором Microsoft и сохранен в базе данных, или мой пароль будет сохранен в виде обычного текста? –

+0

Это сохранит значение, которое находится внутри модели. –

0

Некоторое время назад, я создал полную обертку над .NET Идентичность и код можно найти here. Это может быть полезно для вас. Вы также можете найти nuget here. Я также объяснил библиотеку в блоге here.

 Смежные вопросы

  • Нет связанных вопросов^_^