Example #1
0
        public virtual async Task UpdateUserAsync(IdentityUser user, string providerName)
        {
            var externalUser = await GetUserInfoAsync(user);

            NormalizeExternalLoginUserInfo(externalUser, user.UserName);

            if (!externalUser.Name.IsNullOrWhiteSpace())
            {
                user.Name = externalUser.Name;
            }

            if (!externalUser.Surname.IsNullOrWhiteSpace())
            {
                user.Surname = externalUser.Surname;
            }

            if (user.PhoneNumber != externalUser.PhoneNumber)
            {
                if (!externalUser.PhoneNumber.IsNullOrWhiteSpace())
                {
                    await UserManager.SetPhoneNumberAsync(user, externalUser.PhoneNumber);

                    user.SetPhoneNumberConfirmed(externalUser.PhoneNumberConfirmed == true);
                }
            }
            else
            {
                if (!user.PhoneNumber.IsNullOrWhiteSpace() &&
                    user.PhoneNumberConfirmed == false &&
                    externalUser.PhoneNumberConfirmed == true)
                {
                    user.SetPhoneNumberConfirmed(true);
                }
            }

            if (!string.Equals(user.Email, externalUser.Email, StringComparison.OrdinalIgnoreCase))
            {
                (await UserManager.SetEmailAsync(user, externalUser.Email)).CheckErrors();
                user.SetEmailConfirmed(externalUser.EmailConfirmed ?? false);
            }

            if (externalUser.TwoFactorEnabled != null)
            {
                (await UserManager.SetTwoFactorEnabledAsync(user, externalUser.TwoFactorEnabled.Value)).CheckErrors();
            }

            await IdentityUserRepository.EnsureCollectionLoadedAsync(user, u => u.Logins);

            var userLogin = user.Logins.FirstOrDefault(l => l.LoginProvider == providerName);

            if (userLogin != null)
            {
                if (userLogin.ProviderKey != externalUser.ProviderKey)
                {
                    (await UserManager.RemoveLoginAsync(user, providerName, userLogin.ProviderKey)).CheckErrors();
                    (await UserManager.AddLoginAsync(user, new UserLoginInfo(providerName, externalUser.ProviderKey, providerName))).CheckErrors();
                }
            }
            else
            {
                (await UserManager.AddLoginAsync(user, new UserLoginInfo(providerName, externalUser.ProviderKey, providerName))).CheckErrors();
            }

            user.IsExternal = true;

            (await UserManager.UpdateAsync(user)).CheckErrors();
        }