//HACK investigate correctness of mapping external account

        private async Task <ApplicationUser> AutoProvisionUserAsync(
            string provider, string providerUserId, ExternalLoginProviderUserModel externalLoginProvider
            )
        {
            var userId = m_userManager.CreateUserByExternalProvider(provider, externalLoginProvider);

            if (userId.Succeeded)
            {
                m_userManager.CreateExternalLogin(userId.Result, provider, providerUserId);

                m_userManager.AddRoleToUser(userId.Result, RoleNames.RegisteredUser);

                var user = await m_identityUserManager.FindByIdAsync(userId.Result.ToString());

                return(user);
            }

            return(null);
        }
Exemple #2
0
        public DataResult <int> CreateUserByExternalProvider(
            string providerName,
            ExternalLoginProviderUserModel externalLoginProvider
            )
        {
            var now = m_dateTimeProvider.UtcNow;

            var user = new UserEntity
            {
                Username          = GenerateUsername().Result,
                PasswordHash      = "",
                TwoFactorEnabled  = false,
                LockoutEndDateUtc = null,
                LockoutEnabled    = true,
                AccessFailedCount = 0,
                SecurityStamp     = Guid.NewGuid().ToString(),
                LastChange        = now,
                TwoFactorProvider = null,
            };

            var userData               = new List <UserDataLoAModel>();
            var userContacts           = new List <UserContactLoAModel>();
            var userExternalIdentities = new List <UserExternalIdentityEntity>();

            userData.Add(new UserDataLoAModel
            {
                UserData             = CreateMasterUserId(user),
                LevelOfAssuranceEnum = LevelOfAssuranceEnum.Low,
            });

            if (externalLoginProvider.Email != null)
            {
                var emailValue = externalLoginProvider.Email.Value;

                var result = m_contactManager.ValidateAndFormatContact(emailValue, ContactTypeEnumModel.Email, UserAction.Create);
                if (result.HasError)
                {
                    return(Error <int>(result.Error));
                }

                userContacts.Add(new UserContactLoAModel
                {
                    UserContact = new UserContactEntity
                    {
                        Type  = ContactTypeEnum.Email,
                        User  = user,
                        Value = result.Result,
                    },
                    LevelOfAssuranceEnum = m_mapper.Map <LevelOfAssuranceEnum>(externalLoginProvider.Email.LevelOfAssurance)
                });
            }

            if (externalLoginProvider.PhoneNumber != null)
            {
                var phoneNumberValue = externalLoginProvider.PhoneNumber.Value;

                var result = m_contactManager.ValidateAndFormatContact(phoneNumberValue, ContactTypeEnumModel.Phone, UserAction.Create);
                if (result.HasError)
                {
                    return(Error <int>(result.Error));
                }

                userContacts.Add(new UserContactLoAModel
                {
                    UserContact = new UserContactEntity
                    {
                        Type  = ContactTypeEnum.Phone,
                        User  = user,
                        Value = result.Result,
                    },
                    LevelOfAssuranceEnum = m_mapper.Map <LevelOfAssuranceEnum>(externalLoginProvider.PhoneNumber.LevelOfAssurance)
                });
            }

            try
            {
                var userId = m_userUoW.CreateUser(now, user, userData, userContacts, userExternalIdentities, providerName);

                return(Success(userId));
            }
            catch (SaveEntityException <UserEntity> e)
            {
                m_logger.LogWarning(e);
                return(Error <int>(m_translator.Translate("save-user-failed"), DataResultErrorCode.CreateUserError));
            }
            catch (SaveContactEntityException e)
            {
                m_logger.LogWarning(e);
                return(Error <int>(m_translator.Translate("save-user-contact-failed"),
                                   e.ContactType == ContactTypeEnum.Email
                        ? DataResultErrorCode.CreateUserErrorUserContactEmail
                        : DataResultErrorCode.CreateUserErrorUserContactPhone));
            }
        }