//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); }
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)); } }