public async Task <CreateUserResponse> CreateAccount(CreateUserRequest request) { var user = await _applicationUserManager.FindByEmailAsync(request.Username); var appId = await _appService.GetApplicationByKey(request.ApplicationKey); if (!appId.HasData) { return(CreateUserResponse.Fail("Trying to create user from unknown source ")); } if (user == null) { user = new AppUser() { Email = request.Username, UserName = request.Username, FirstName = request.FirstName, LastName = request.LastName, PhoneNumber = request.PhoneNumber, ApplicationId = appId.Object.Id, LockoutEnabled = true, EmailConfirmed = true }; var identityResult = await _applicationUserManager.CreateAsync(user, request.Password); if (!identityResult.Succeeded) { return(CreateUserResponse.Fail(identityResult.Errors.First().Description)); } } else { return(CreateUserResponse.Fail("Email already exist in our system")); } if (!user.EmailConfirmed) { return(CreateUserResponse.Fail("Account already exist, email address is not confirmed yet.")); } //TODO Add user to group var newlyCreatedUser = await _applicationUserManager.FindByEmailAsync(request.Email); var applicationGroups = await _groupService.GetApplicationGroups(appId.Object.Id); if (request.Group == null || !request.Group.Any()) { if (applicationGroups != null && applicationGroups.Any()) { request.Group = new List <string>(); var defaultGroup = applicationGroups.First(x => x.Name.Equals(SystemDefaultGroups.DefaultUser.ToString())); if (defaultGroup != null) { await _groupService.AddUserToGroup(newlyCreatedUser, defaultGroup); } } } else if (request.Group != null && request.Group.Any()) { var userGroups = applicationGroups.Where(x => request.Group.Contains(x.Name)); if (userGroups.Any()) { foreach (var group in userGroups) { await _groupService.AddUserToGroup(newlyCreatedUser, group); } } } if (user.EmailConfirmed) { return(CreateUserResponse.Succeed("Account created successfully")); } var token = await _applicationUserManager.GenerateEmailConfirmationTokenAsync(newlyCreatedUser); var url = $"{request.ConfirmationUrl}?token={EncodeToken(token)}&username={request.Username}"; var name = newlyCreatedUser.FullName; var filePath = _hostingEnvironment.ContentRootPath; var emailTemplate = System.IO.Path.Combine(filePath, "Template", "Emails", "CreateAccount.html"); var emailFile = await System.IO.File.ReadAllTextAsync(emailTemplate); var emailContent = ReplaceEmail(emailFile, new Dictionary <string, string> { ["name"] = name, ["url"] = url }); var wrapperTemplate = System.IO.Path.Combine(filePath, "Template", "Emails", "_Email_Wrapper.html"); var wrapperFile = await System.IO.File.ReadAllTextAsync(wrapperTemplate); var result = ReplaceEmail(wrapperFile, new Dictionary <string, string> { ["emailContent"] = emailContent }); var emailMessage = new EmailMessage { To = request.Username, Subject = "FindYourData.io Account Creation", HtmlContent = result }; await _emailService.SendEmailAsync(emailMessage); return(CreateUserResponse.Succeed("Account confirmation email sent, please check your email")); }