Passkey サインインでは、電子メール/電話の確認とロックアウトが適用されます

SignInManager<TUser>.PasskeySignInAsync ユーザーがサインインする前に PreSignInCheck を呼び出すようになりました。 つまり、ユーザーのアカウントがロックアウトされているか、構成されている RequireConfirmedEmailRequireConfirmedPhoneNumber、または RequireConfirmedAccount ポリシーを満たしていない場合、成功したパスキー アサーションだけではサインインできなくなります。 これにより、パスキー のサインイン動作が、 PasswordSignInAsync およびその他のサインイン メソッドに合わせて調整されます。

導入されたバージョン

.NET 11

以前の動作

以前は、 SignInManager<TUser>.PasskeySignInAsyncPreSignInCheckを呼び出しませんでした。 パスキー アサーションが成功すると、次の場合でもユーザーはサインインできました。

  • SignInOptions.RequireConfirmedEmailtrue され、ユーザーの電子メールが確認されませんでした。
  • SignInOptions.RequireConfirmedPhoneNumbertrue され、ユーザーの電話番号が確認されませんでした。
  • SignInOptions.RequireConfirmedAccounttrue され、ユーザーのアカウントが確認されませんでした。
  • ユーザーがロックアウトされました ( LockoutEnd は将来の予定でした)。

これは、既にこれらの要件を適用している PasswordSignInAsync やその他のサインイン方法と矛盾していました。

新しい動作

ASP.NET Core 11 以降では、成功したパスキー アサーションの後、PasskeySignInAsync は認証PreSignInCheckを発行する前に cookie を呼び出します。 ユーザーが構成済みのチェックのいずれかに失敗した場合、メソッドはユーザーにサインインせずに次のいずれかを返します。

破壊的変更の種類

この変更は 動作の変更です。

変更の理由

PasskeySignInAsync他のPreSignInCheckサインイン メソッドが行うSignInManager呼び出しが見つかりませんでした。 その結果、パスワード サインインに確認済みの電子メールまたは電話が必要なアプリケーションでは、ユーザーがパスキーを登録することで、その要件を誤ってバイパスできます。 この変更により、パスキーによるサインインは、サインイン画面の他の部分と整合するようになります。 詳細については、 dotnet/aspnetcore#65024 を参照してください。

パスワード サインイン用に既に処理しているのと同じ方法で、サインイン UI フローを確認して、パスキー サインインの SignInResult.LockedOutSignInResult.NotAllowed を処理します。 ASP.NET Core テンプレートのスキャフォールディングされた Identity UI は、既に両方の結果を処理します。

アプリが現在、これらのチェックをバイパスするためにパスキー サインインに依存している場合、最も安全な変更は、チェック自体を削除するのではなく、関連するユーザー レコードを更新することです (たとえば、確認済みとしてメールをマークします)。 SignInManager<TUser>.PreSignInCheckのチェックを削除すると、パスキー サインインだけでなく、すべてのサインイン パスに影響します。

影響を受ける API