web-dev-qa-db-ja.com

UserManager.CheckPasswordAsyncとSignInManager.PasswordSignInAsync

aSPネットコアアイデンティティを使用-ユーザーがパスワードとユーザー名を提供してjwtトークンを取得すると、資格情報を/ api/tokenに投稿します

私のトークンコントローラーメソッドは、userPasswordManagerを使用して、CheckPasswordAsyncを使用してパスワードを確認する必要がありますか?

私は両方の例を見て、それぞれの利点は何であるか、一方が他方より優れているのではないかと考えました。

現在、私のチームの誰かが次のように書いています:

[AllowAnonymous]
[HttpPost]
public async Task<ActionResult<User>> Post([FromBody]User model)
{
    try
    {                                              
        var user = await _userManager.FindByNameAsync(model.Username);
        if (user == null)
            return StatusCode(StatusCodes.Status401Unauthorized, "Incorrect username or password");

        var passwordOK = await _userManager.CheckPasswordAsync(user, model.Password);
        if (!passwordOK)
            return StatusCode(StatusCodes.Status401Unauthorized, "Incorrect username or password");

        model.Id = user.Id;
        model.Name = user.DisplayName;
        model.Password = "";               

        int expiresIn;
        long expiresOn;
        model.Token = _authorisationService.GetJWTToken(model.Username, user.Id, out expiresIn, out expiresOn);
        model.ExpiresIn = expiresIn;
        model.ExpiresOn = expiresOn;

        return model;
    }
    catch (Exception)
    {
        // log the exception
        return StatusCode(StatusCodes.Status500InternalServerError);
    }
}

でもそれは必要ないこともあると思います。

13
JimmyShoe

あなたが言及した2つの方法は異なる目的を果たします:

1. UserManager.CheckPasswordAsync

このメソッドは、指定されたパスワードをハッシュし、それを既存のパスワードハッシュ(データベースに格納されているなど)と比較します。

2. SignInManager.PasswordSignInAsync

このメソッドもっとたくさん。大まかな内訳は次のとおりです。

  • サインインが許可されているかどうかを確認します。たとえば、ユーザーがログインを許可される前に確認済みのメールが必要な場合、メソッドはSignInResult.Failedを返します。
  • UserManager.CheckPasswordAsyncを呼び出して、パスワードが正しいことを確認します(上記のとおり)。
    • パスワードが正しくなく、ロックアウトがサポートされている場合、このメソッドは失敗したサインインの試行を追跡します。失敗したサインイン試行の構成された量を超えると、メソッドはユーザーをロックアウトします。
  • ユーザーに対して2要素認証が有効になっている場合、メソッドは関連するCookieを設定し、SignInResult.TwoFactorRequiredを返します。
  • 最後に、サインインプロセスを実行します。これにより、ClaimsPrincipalが作成され、Cookieを介して永続化されます。

確認済みのメールやロックアウトなどの要求に関心がない場合は、質問のようにUserManager.CheckPasswordAsyncを使用するだけで十分です。

13
Kirk Larkin