2016-09-01 34 views
2

私はカスタムasp.netアイデンティティをやってtables.I作り付けのasp.netを使用していないが正常にカスタムCreateAsyncasp.netのIDのUpdateAsyncメソッドのカスタム実装を与える方法は?

を実装して、ユーザーを作成している今、私は新しい暗号化されたパスワードでユーザーを更新したいので、私はどのようになっておりません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みなさん、とても良い提案をいただきありがとうございます。私は本当に感謝しています。私はこのコードをデバッグするときのように問題に直面しているし、戻って戻ってくることはありません。このtask.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のIDで暗号化され、データベースに保存されるか、パスワードはプレーンテキストで保存されますか? –

+0

これはモデルの中にある値を保存します。 –

0

、私は.NETのアイデンティティを完全にラッパーを作成し、コードがhere見つけることができます。それはあなたにとって有益かもしれません。ナゲットhereも見つけることができます。私はまた、ブログhereにライブラリを説明しました。

関連する問題