ログイン
前回登録したユーザーでログインしようとすると、またエラーが発生します。
Store does not implement IUserLockoutStore<TUser>.
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
|
どうしたものかとググってみると、このメソッドをオーバーライドしているサイトを見つけました。
同じようにオーバーライドします。
あとは、ストアクラスにパスワード取得メソッドを実装すればOKです。
public class ApplicationUserStore : IUserStore<ApplicationUser>, IUserPasswordStore<ApplicationUser> { public Task<string> GetPasswordHashAsync(ApplicationUser user) { return Task.FromResult(user.PasswordHash); } }
パスワード変更
パスワードの変更画面でパスワードを変更しようとすると、またまたエラーが発生します。
ストアは IUserEmailStore<TUser> を実装していません。
var result = await UserManager.ChangePasswordAsync(User.Identity.GetUserId(), model.OldPassword, model.NewPassword);
|
もうお分かりですよね?
ChangePasswordAsyncをオーバーライドします。
public override async Task<IdentityResult> ChangePasswordAsync(string userId, string currentPassword, string newPassword) { var store = (ApplicationUserStore)this.Store; var user = await store.FindByIdAsync(userId); var result = await VerifyPasswordAsync(store, user, currentPassword); if (!result) { return IdentityResult.Failed("パスワードが正しくありません。"); } var identifyResult = await UpdatePassword(store, user, newPassword); if (!identifyResult.Succeeded) { return identifyResult; } await store.UpdateAsync(user); return IdentityResult.Success; }
必要なメソッドをストアクラスに実装します。
public class ApplicationUserStore : IUserStore<ApplicationUser>, IUserPasswordStore<ApplicationUser> { public Task<ApplicationUser> FindByIdAsync(string userId) { return this._context.ApplicationUsers.SingleOrDefaultAsync(x => x.Id == userId); } public Task UpdateAsync(ApplicationUser user) { return this._context.SaveChangesAsync(); } }
これでパスワード変更ができました。
またいつか、どこかで。
0 件のコメント:
コメントを投稿