From e2f5c93528ac63fd4fed1efd8d880df05506db7d Mon Sep 17 00:00:00 2001 From: Nikolaj Date: Tue, 16 Aug 2022 15:47:01 +0200 Subject: [PATCH 1/2] Ensure that LoginTokens gets marked as dirty Might want to experiment with only removing/updating if the value is different --- .../Security/BackOfficeUserStore.cs | 13 +++++++------ .../Security/MemberUserStore.cs | 13 +++++++------ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/Umbraco.Infrastructure/Security/BackOfficeUserStore.cs b/src/Umbraco.Infrastructure/Security/BackOfficeUserStore.cs index ade3ca7d1c..0d12afb482 100644 --- a/src/Umbraco.Infrastructure/Security/BackOfficeUserStore.cs +++ b/src/Umbraco.Infrastructure/Security/BackOfficeUserStore.cs @@ -440,15 +440,16 @@ public class BackOfficeUserStore : UmbracoUserStore x.LoginProvider.InvariantEquals(loginProvider) && x.Name.InvariantEquals(name)); - if (token == null) + + // We have to remove token and then re-add to ensure that LoginTokens are dirty, which is required for them to save + // This is because we're using an observable collection, which only cares about added/removed items. + if (token is not null) { - user.LoginTokens.Add(new IdentityUserToken(loginProvider, name, value, user.Id)); - } - else - { - token.Value = value; + user.LoginTokens.Remove(token); } + user.LoginTokens.Add(new IdentityUserToken(loginProvider, name, value, user.Id)); + return Task.CompletedTask; } diff --git a/src/Umbraco.Infrastructure/Security/MemberUserStore.cs b/src/Umbraco.Infrastructure/Security/MemberUserStore.cs index db19da026e..e21db2e228 100644 --- a/src/Umbraco.Infrastructure/Security/MemberUserStore.cs +++ b/src/Umbraco.Infrastructure/Security/MemberUserStore.cs @@ -580,15 +580,16 @@ public class MemberUserStore : UmbracoUserStore x.LoginProvider.InvariantEquals(loginProvider) && x.Name.InvariantEquals(name)); - if (token == null) + + // We have to remove token and then re-add to ensure that LoginTokens are dirty, which is required for them to save + // This is because we're using an observable collection, which only cares about added/removed items. + if (token is not null) { - user.LoginTokens.Add(new IdentityUserToken(loginProvider, name, value, user.Id)); - } - else - { - token.Value = value; + user.LoginTokens.Remove(token); } + user.LoginTokens.Add(new IdentityUserToken(loginProvider, name, value, user.Id)); + return Task.CompletedTask; } From 838f4199c87308be728b32352756fe1e23d59f33 Mon Sep 17 00:00:00 2001 From: Nikolaj Date: Wed, 17 Aug 2022 14:36:09 +0200 Subject: [PATCH 2/2] Only recreate token if it has changed. --- src/Umbraco.Infrastructure/Security/BackOfficeUserStore.cs | 6 ++++++ src/Umbraco.Infrastructure/Security/MemberUserStore.cs | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/src/Umbraco.Infrastructure/Security/BackOfficeUserStore.cs b/src/Umbraco.Infrastructure/Security/BackOfficeUserStore.cs index 0d12afb482..244885887e 100644 --- a/src/Umbraco.Infrastructure/Security/BackOfficeUserStore.cs +++ b/src/Umbraco.Infrastructure/Security/BackOfficeUserStore.cs @@ -445,6 +445,12 @@ public class BackOfficeUserStore : UmbracoUserStore