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);
}
}
でもそれは必要ないこともあると思います。
あなたが言及した2つの方法は異なる目的を果たします:
このメソッドは、指定されたパスワードをハッシュし、それを既存のパスワードハッシュ(データベースに格納されているなど)と比較します。
このメソッドもっとたくさん。大まかな内訳は次のとおりです。
SignInResult.Failed
を返します。UserManager.CheckPasswordAsync
を呼び出して、パスワードが正しいことを確認します(上記のとおり)。SignInResult.TwoFactorRequired
を返します。ClaimsPrincipal
が作成され、Cookieを介して永続化されます。確認済みのメールやロックアウトなどの要求に関心がない場合は、質問のようにUserManager.CheckPasswordAsync
を使用するだけで十分です。