diff --git a/core/modules/user/src/Form/UserLoginForm.php b/core/modules/user/src/Form/UserLoginForm.php
index c4f828c451f6e89cda6ba6edd9d41aee66967200..fc8a8b990bdb2138c82a1eb220de01879def9e44 100644
--- a/core/modules/user/src/Form/UserLoginForm.php
+++ b/core/modules/user/src/Form/UserLoginForm.php
@@ -232,10 +232,10 @@ public function validateAuthentication(array &$form, FormStateInterface $form_st
         if ($this->userAuth instanceof UserAuthenticationInterface) {
           $form_state->set('uid', $this->userAuth->authenticateAccount($account, $password) ? $account->id() : FALSE);
         }
-        else {
-          $uid = $this->userAuth->authenticate($form_state->getValue('name'), $password);
-          $form_state->set('uid', $uid);
-        }
+      }
+      elseif (!$this->userAuth instanceof UserAuthenticationInterface) {
+        $uid = $this->userAuth->authenticate($form_state->getValue('name'), $password);
+        $form_state->set('uid', $uid);
       }
     }
   }
diff --git a/core/modules/user/src/UserAuth.php b/core/modules/user/src/UserAuth.php
index b4f0c0c356dc2f3c7b600e0659111f3cd73d5403..71c7077da6b28b027841ea171cda79800358732f 100644
--- a/core/modules/user/src/UserAuth.php
+++ b/core/modules/user/src/UserAuth.php
@@ -8,7 +8,7 @@
 /**
  * Validates user authentication credentials.
  */
-class UserAuth implements UserAuthInterface, UserAuthenticationInterface {
+class UserAuth implements UserAuthInterface {
 
   /**
    * The entity type manager.
@@ -33,6 +33,7 @@ class UserAuth implements UserAuthInterface, UserAuthenticationInterface {
    *   The password service.
    */
   public function __construct(EntityTypeManagerInterface $entity_type_manager, PasswordInterface $password_checker) {
+    @trigger_error(__CLASS__ . ' is deprecated in drupal:10.3.0 and will be removed from drupal:12.0.0. Implement \Drupal\user\UserAuthenticationInterface instead. See https://www.drupal.org/node/3411040');
     $this->entityTypeManager = $entity_type_manager;
     $this->passwordChecker = $password_checker;
   }
@@ -48,41 +49,20 @@ public function authenticate($username, #[\SensitiveParameter] $password) {
       $account_search = $this->entityTypeManager->getStorage('user')->loadByProperties(['name' => $username]);
 
       if ($account = reset($account_search)) {
-        if ($this->authenticateAccount($account, $password)) {
+        if ($this->passwordChecker->check($password, $account->getPassword())) {
+          // Successful authentication.
           $uid = $account->id();
-        }
-      }
-    }
-    return $uid;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function lookupAccount($identifier): UserInterface|false {
-    if (!empty($identifier)) {
-      $account_search = $this->entityTypeManager->getStorage('user')->loadByProperties(['name' => $identifier]);
 
-      if ($account = reset($account_search)) {
-        return $account;
+          // Update user to new password scheme if needed.
+          if ($this->passwordChecker->needsRehash($account->getPassword())) {
+            $account->setPassword($password);
+            $account->save();
+          }
+        }
       }
     }
-    return FALSE;
-  }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function authenticateAccount(UserInterface $account, #[\SensitiveParameter] string $password): bool {
-    if ($this->passwordChecker->check($password, $account->getPassword())) {
-      // Update user to new password scheme if needed.
-      if ($this->passwordChecker->needsRehash($account->getPassword())) {
-        $account->setPassword($password);
-        $account->save();
-      }
-      return TRUE;
-    }
-    return FALSE;
+    return $uid;
   }
 
 }
diff --git a/core/modules/user/src/UserAuthentication.php b/core/modules/user/src/UserAuthentication.php
new file mode 100644
index 0000000000000000000000000000000000000000..a7168442a7d12eb7bf1910933cd56b9b40521f17
--- /dev/null
+++ b/core/modules/user/src/UserAuthentication.php
@@ -0,0 +1,88 @@
+<?php
+
+namespace Drupal\user;
+
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Password\PasswordInterface;
+
+/**
+ * Validates user authentication credentials.
+ */
+class UserAuthentication implements UserAuthInterface, UserAuthenticationInterface {
+
+  /**
+   * The entity type manager.
+   *
+   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
+   */
+  protected $entityTypeManager;
+
+  /**
+   * The password hashing service.
+   *
+   * @var \Drupal\Core\Password\PasswordInterface
+   */
+  protected $passwordChecker;
+
+  /**
+   * Constructs a UserAuth object.
+   *
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
+   *   The entity type manager.
+   * @param \Drupal\Core\Password\PasswordInterface $password_checker
+   *   The password service.
+   */
+  public function __construct(EntityTypeManagerInterface $entity_type_manager, PasswordInterface $password_checker) {
+    $this->entityTypeManager = $entity_type_manager;
+    $this->passwordChecker = $password_checker;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function authenticate($username, #[\SensitiveParameter] $password) {
+    @trigger_error(__METHOD__ . ' is deprecated in drupal:10.3.0 and will be removed from drupal:12.0.0. Implement \Drupal\user\UserAuthenticationInterface instead. See https://www.drupal.org/node/3411040');
+    $uid = FALSE;
+
+    if (!empty($username) && strlen($password) > 0) {
+      $account_search = $this->entityTypeManager->getStorage('user')->loadByProperties(['name' => $username]);
+
+      if ($account = reset($account_search)) {
+        if ($this->authenticateAccount($account, $password)) {
+          $uid = $account->id();
+        }
+      }
+    }
+    return $uid;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function lookupAccount($identifier): UserInterface|false {
+    if (!empty($identifier)) {
+      $account_search = $this->entityTypeManager->getStorage('user')->loadByProperties(['name' => $identifier]);
+
+      if ($account = reset($account_search)) {
+        return $account;
+      }
+    }
+    return FALSE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function authenticateAccount(UserInterface $account, #[\SensitiveParameter] string $password): bool {
+    if ($this->passwordChecker->check($password, $account->getPassword())) {
+      // Update user to new password scheme if needed.
+      if ($this->passwordChecker->needsRehash($account->getPassword())) {
+        $account->setPassword($password);
+        $account->save();
+      }
+      return TRUE;
+    }
+    return FALSE;
+  }
+
+}
diff --git a/core/modules/user/user.services.yml b/core/modules/user/user.services.yml
index e2ec9cc3a0673d6658a52546ec0c0edc44f22aad..ec34738d992ea00d41bef37149cb1db7419777b6 100644
--- a/core/modules/user/user.services.yml
+++ b/core/modules/user/user.services.yml
@@ -43,7 +43,7 @@ services:
     tags:
       - { name: theme_negotiator, priority: -40 }
   user.auth:
-    class: Drupal\user\UserAuth
+    class: Drupal\user\UserAuthentication
     arguments: ['@entity_type.manager', '@password']
   Drupal\user\UserAuthInterface: '@user.auth'
   user.permissions: