diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ExternalLoginRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ExternalLoginRepository.cs index 766d654c08..1ba91ab3e1 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ExternalLoginRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ExternalLoginRepository.cs @@ -57,10 +57,17 @@ internal class ExternalLoginRepository : EntityRepositoryBase("WHERE userOrMemberKey=@userOrMemberKey", new { userOrMemberKey }); /// - public void DeleteUserLoginsForRemovedProviders(IEnumerable currentLoginProviders) => - Database.Execute(Sql() - .Delete() - .WhereNotIn(x => x.LoginProvider, currentLoginProviders)); + public void DeleteUserLoginsForRemovedProviders(IEnumerable currentLoginProviders) + { + Sql sql = Sql() + .Select(x => x.Id) + .From() + .Where(x => !x.LoginProvider.StartsWith(Constants.Security.MemberExternalAuthenticationTypePrefix)) // Only remove external logins relating to backoffice users, not members. + .WhereNotIn(x => x.LoginProvider, currentLoginProviders); + + var toDelete = Database.Query(sql).Select(x => x.Id).ToList(); + DeleteExternalLogins(toDelete); + } /// public void Save(Guid userOrMemberKey, IEnumerable logins) @@ -100,13 +107,7 @@ internal class ExternalLoginRepository : EntityRepositoryBase 0) - { - // Before we can remove the external login, we must remove the external login tokens associated with that external login, - // otherwise we'll get foreign key constraint errors - Database.DeleteMany().Where(x => toDelete.Contains(x.ExternalLoginId)).Execute(); - Database.DeleteMany().Where(x => toDelete.Contains(x.Id)).Execute(); - } + DeleteExternalLogins(toDelete); foreach (KeyValuePair u in toUpdate) { @@ -116,6 +117,19 @@ internal class ExternalLoginRepository : EntityRepositoryBase ExternalLoginFactory.BuildDto(userOrMemberKey, i))); } + private void DeleteExternalLogins(List externalLoginIds) + { + if (externalLoginIds.Count == 0) + { + return; + } + + // Before we can remove the external login, we must remove the external login tokens associated with that external login, + // otherwise we'll get foreign key constraint errors + Database.DeleteMany().Where(x => externalLoginIds.Contains(x.ExternalLoginId)).Execute(); + Database.DeleteMany().Where(x => externalLoginIds.Contains(x.Id)).Execute(); + } + /// public void Save(Guid userOrMemberKey, IEnumerable tokens) {