Index: gnome-shell-45.3/data/dbus-interfaces/org.freedesktop.login1.Session.xml
===================================================================
--- gnome-shell-45.3.orig/data/dbus-interfaces/org.freedesktop.login1.Session.xml
+++ gnome-shell-45.3/data/dbus-interfaces/org.freedesktop.login1.Session.xml
@@ -5,9 +5,10 @@
     <property name="Active" type="b" access="read"/>
     <property name="Class" type="s" access="read"/>
     <property name="Id" type="s" access="read"/>
+    <property name="Name" type="s" access="read"/>
     <property name="Remote" type="b" access="read"/>
-    <property name="Type" type="s" access="read"/>
     <property name="State" type="s" access="read"/>
+    <property name="Type" type="s" access="read"/>
     <method name="SetLockedHint">
       <arg type="b" direction="in"/>
     </method>
Index: gnome-shell-45.3/js/gdm/loginDialog.js
===================================================================
--- gnome-shell-45.3.orig/js/gdm/loginDialog.js
+++ gnome-shell-45.3/js/gdm/loginDialog.js
@@ -418,9 +418,10 @@ export const ConflictingSessionDialog =
         'force-stop': {},
     },
 }, class ConflictingSessionDialog extends ModalDialog.ModalDialog {
-    _init(conflictingSession, greeterSession, userName) {
+    _init(conflictingSession, greeterSession) {
         super._init();
 
+        const userName = conflictingSession.Name;
         let bannerText;
         if (greeterSession.Remote && conflictingSession.Remote)
             /* Translators: is running for <username> */
@@ -1111,8 +1112,7 @@ export const LoginDialog = GObject.regis
 
     _showConflictingSessionDialog(serviceName, conflictingSession) {
         let conflictingSessionDialog = new ConflictingSessionDialog(conflictingSession,
-            this._greeterSessionProxy,
-            this._user.get_user_name());
+            this._greeterSessionProxy);
 
         conflictingSessionDialog.connect('cancel', () => {
             this._authPrompt.reset();
@@ -1188,15 +1188,15 @@ export const LoginDialog = GObject.regis
         });
     }
 
-    async _findConflictingSession(ignoreSessionId) {
-        const userName = this._user.get_user_name();
+    async _findConflictingSession(startingSessionId) {
         const loginManager = LoginManager.getLoginManager();
         const sessions = await loginManager.listSessions();
+        const [, , startingSessionOwner, ,] = sessions.find(([id, , , ,]) => id === startingSessionId);
         for (const session of sessions.map(([id, , user, , path]) => ({id, user, path}))) {
-            if (ignoreSessionId === session.id)
+            if (startingSessionId === session.id)
                 continue;
 
-            if (userName !== session.user)
+            if (startingSessionOwner !== session.user)
                 continue;
 
             const sessionProxy = loginManager.getSession(session.path);
@@ -1214,38 +1214,43 @@ export const LoginDialog = GObject.regis
     }
 
     async _onSessionOpened(client, serviceName, sessionId) {
-        if (sessionId) {
-            const conflictingSession = await this._findConflictingSession(sessionId);
-            if (conflictingSession) {
-                this._showConflictingSessionDialog(serviceName, conflictingSession);
+        try {
+            if (sessionId) {
+                const conflictingSession = await this._findConflictingSession(sessionId);
+                if (conflictingSession) {
+                    this._showConflictingSessionDialog(serviceName, conflictingSession);
+                    return;
+                }
+             }
+
+            if (this._user != null && this._user.get_num_sessions_anywhere() > 1) {
+                this._authPrompt.setMessage(
+                    _('Sorry, you have to log out a previous session first. Multiple logins are not supported.'),
+                    GdmUtil.MessageType.ERROR);
+                // TODO: The following logic relies on the unverified fact that
+                // `AuthPrompt::_onVerificationComplete` seems to always run after
+                // current handler. This might root from the interaction between
+                // greeter and verifier, both are external programs.
+                this._authPrompt.verificationStatus = AuthPrompt.AuthPromptStatus.VERIFIED_BUT_FORBIDDEN;
+                this._authPrompt.cancelButton.reactive = true;
+
+                // NOTE: Failed Attempts as references
+                //
+                // NOTE: reset is too heavy, it skips the error prompt all together
+                // this._authPrompt.reset();
+                //
+                // NOTE: Diconnect at this stage is not working
+                //
+                // this._authPrompt._userVerifier.disconnect(this._authPrompt._userVerifierCompleteId);
+
                 return;
             }
-        }
 
-        if (this._user != null && this._user.get_num_sessions_anywhere() > 1) {
-            this._authPrompt.setMessage(
-                _('Sorry, you have to log out a previous session first. Multiple logins are not supported.'),
-                GdmUtil.MessageType.ERROR);
-            // TODO: The following logic relies on the unverified fact that
-            // `AuthPrompt::_onVerificationComplete` seems to always run after
-            // current handler. This might root from the interaction between
-            // greeter and verifier, both are external programs.
-            this._authPrompt.verificationStatus = AuthPrompt.AuthPromptStatus.VERIFIED_BUT_FORBIDDEN;
-            this._authPrompt.cancelButton.reactive = true;
-
-            // NOTE: Failed Attempts as references
-            //
-            // NOTE: reset is too heavy, it skips the error prompt all together
-            // this._authPrompt.reset();
-            //
-            // NOTE: Diconnect at this stage is not working
-            //
-            // this._authPrompt._userVerifier.disconnect(this._authPrompt._userVerifierCompleteId);
-
-            return;
+            this._authPrompt.finish(() => this._startSession(serviceName));
+        } catch (error) {
+            logError(error, `Failed to start session '${sessionId}'`);
+            this._authPrompt.reset();
         }
-
-        this._authPrompt.finish(() => this._startSession(serviceName));
     }
 
     _waitForItemForUser(userName) {
