diff --git a/src/Umbraco.Infrastructure/Security/BackOfficeUserStore.cs b/src/Umbraco.Infrastructure/Security/BackOfficeUserStore.cs index ade3ca7d1c..244885887e 100644 --- a/src/Umbraco.Infrastructure/Security/BackOfficeUserStore.cs +++ b/src/Umbraco.Infrastructure/Security/BackOfficeUserStore.cs @@ -440,15 +440,22 @@ 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; + // The token hasn't changed, so there's no reason for us to re-add it. + if (token.Value == value) + { + return Task.CompletedTask; + } + + 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..40bfc73a3d 100644 --- a/src/Umbraco.Infrastructure/Security/MemberUserStore.cs +++ b/src/Umbraco.Infrastructure/Security/MemberUserStore.cs @@ -580,15 +580,22 @@ 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; + // The token hasn't changed, so there's no reason for us to re-add it. + if (token.Value == value) + { + return Task.CompletedTask; + } + + user.LoginTokens.Remove(token); } + user.LoginTokens.Add(new IdentityUserToken(loginProvider, name, value, user.Id)); + return Task.CompletedTask; }