SignInManager<TUser>.PasskeySignInAsync ユーザーがサインインする前に PreSignInCheck を呼び出すようになりました。 つまり、ユーザーのアカウントがロックアウトされているか、構成されている RequireConfirmedEmail、 RequireConfirmedPhoneNumber、または RequireConfirmedAccount ポリシーを満たしていない場合、成功したパスキー アサーションだけではサインインできなくなります。 これにより、パスキー のサインイン動作が、 PasswordSignInAsync およびその他のサインイン メソッドに合わせて調整されます。
導入されたバージョン
.NET 11
以前の動作
以前は、 SignInManager<TUser>.PasskeySignInAsync は PreSignInCheckを呼び出しませんでした。 パスキー アサーションが成功すると、次の場合でもユーザーはサインインできました。
-
SignInOptions.RequireConfirmedEmailがtrueされ、ユーザーの電子メールが確認されませんでした。 -
SignInOptions.RequireConfirmedPhoneNumberがtrueされ、ユーザーの電話番号が確認されませんでした。 -
SignInOptions.RequireConfirmedAccountがtrueされ、ユーザーのアカウントが確認されませんでした。 - ユーザーがロックアウトされました (
LockoutEndは将来の予定でした)。
これは、既にこれらの要件を適用している PasswordSignInAsync やその他のサインイン方法と矛盾していました。
新しい動作
ASP.NET Core 11 以降では、成功したパスキー アサーションの後、PasskeySignInAsync は認証PreSignInCheckを発行する前に cookie を呼び出します。 ユーザーが構成済みのチェックのいずれかに失敗した場合、メソッドはユーザーにサインインせずに次のいずれかを返します。
- SignInResult.LockedOut ユーザーがロックアウトされている場合は 。
- SignInResult.NotAllowed ユーザーの電子メール、電話、またはアカウントが確認されていない場合。
破壊的変更の種類
この変更は 動作の変更です。
変更の理由
PasskeySignInAsync他のPreSignInCheckサインイン メソッドが行うSignInManager呼び出しが見つかりませんでした。 その結果、パスワード サインインに確認済みの電子メールまたは電話が必要なアプリケーションでは、ユーザーがパスキーを登録することで、その要件を誤ってバイパスできます。 この変更により、パスキーによるサインインは、サインイン画面の他の部分と整合するようになります。 詳細については、 dotnet/aspnetcore#65024 を参照してください。
推奨されるアクション
パスワード サインイン用に既に処理しているのと同じ方法で、サインイン UI フローを確認して、パスキー サインインの SignInResult.LockedOut と SignInResult.NotAllowed を処理します。 ASP.NET Core テンプレートのスキャフォールディングされた Identity UI は、既に両方の結果を処理します。
アプリが現在、これらのチェックをバイパスするためにパスキー サインインに依存している場合、最も安全な変更は、チェック自体を削除するのではなく、関連するユーザー レコードを更新することです (たとえば、確認済みとしてメールをマークします)。
SignInManager<TUser>.PreSignInCheckのチェックを削除すると、パスキー サインインだけでなく、すべてのサインイン パスに影響します。
影響を受ける API
ASP.NET Core