2016年10月21日金曜日

ASP.NET Identityを利用して独自ユーザーを作る(後編)

今回はログインとパスワード変更です。

ログイン


前回登録したユーザーでログインしようとすると、またエラーが発生します。

Store does not implement IUserLockoutStore<TUser>.


var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
switch (result) {

どうしたものかとググってみると、このメソッドをオーバーライドしているサイトを見つけました。
同じようにオーバーライドします。

あとは、ストアクラスにパスワード取得メソッドを実装すれば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);
if (result.Succeeded) {

もうお分かりですよね?
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 件のコメント:

コメントを投稿