public async Task <IActionResult> RegisterCompany([FromBody] RegisterCompanyViewmodel model) { try { // As opposed to generating a signed JWT token, just parse // the model to a base64 string and inject it into the token. // Convert model to json. var modelJson = JsonSerializer.Serialize(model); // Get bytes of json string. var bytes = Encoding.UTF8.GetBytes(modelJson); // Get base64 of bytes. var model64 = Convert.ToBase64String(bytes); var key = config["Sys:Key"]; var issuer = config["Sys:Issuer"]; var audience = config["Sys:Audience"]; var token = TokenHelper.JwtTokenGenerator(model64, key, issuer, audience); await SendRegisterCompanyEmail(model, model.User.Name, token); return(Ok()); } catch (Exception ex) { _logger.LogError("Unable to register company user", ex); return(BadRequest(ex.ToString())); } }
public async Task <IActionResult> ConfirmCompany([FromBody] RegisterCompanyViewmodel model) { try { // Create the company. var company = new Company { Address = model.Company.Address, Name = model.Company.Name }; await context.Companies.AddAsync(company); await context.SaveChangesAsync(); // Register the user account. var user = new IdentityUser { Email = model.User.Email, UserName = model.User.Email, EmailConfirmed = true }; var result = await userManager.CreateAsync(user, model.User.Password); if (!result.Succeeded) { return(BadRequest(result)); } // Assign user to role. var companyRoleName = nameof(SystemRoles.Company); if (!await roleManager.RoleExistsAsync(companyRoleName)) { await roleManager.CreateAsync(new IdentityRole(companyRoleName)); } await userManager.AddToRoleAsync(user, companyRoleName); // Create a link associating the the user with the company. await context.CompanyUsers.AddAsync(new CompanyUsers { Company = company, User = user }); await context.SaveChangesAsync(); return(Ok()); } catch (Exception ex) { _logger.LogError($"Unable to register new company", ex); return(BadRequest(ex.ToString())); } }
public async Task OnPost() { try { if (ModelState.IsValid) { if (UserInput.ConfirmPassword == UserInput.Password) { // As opposed to generating a signed JWT token, just parse // the model to a base64 string and inject it into the token. var model = new RegisterCompanyViewmodel { Company = CompanyInput, User = new RegisterUserViewmodel { Email = UserInput.Email, IsCompany = true, Name = UserInput.Name, Password = UserInput.Password } }; // Convert model to json. var modelJson = JsonSerializer.Serialize(model); // Get bytes of json string. var bytes = Encoding.UTF8.GetBytes(modelJson); // Get base64 of bytes. var model64 = Convert.ToBase64String(bytes); var key = config["Sys:Key"]; var issuer = config["Sys:Issuer"]; var audience = config["Sys:Audience"]; var token = TokenHelper.JwtTokenGenerator(model64, key, issuer, audience); await SendRegisterCompanyEmail(UserInput.Email, UserInput.Name, token); } else { ModelState.AddModelError(nameof(UserInput.ConfirmPassword), "Passwords don't match"); } } else { ModelState.AddModelError(string.Empty, "Please ensure that you've filled in all the required fields."); } } catch (Exception ex) { logger.LogError($"Unable to register new company: {ex}", ex); } }
private async Task SendRegisterCompanyEmail(RegisterCompanyViewmodel model, string name, string token) { var filePath = Path.Combine(environment.ContentRootPath, EmailTemplateConstants.USER_REGISTRATION_PATH); using var reader = new StreamReader(filePath); var mailText = await reader.ReadToEndAsync(); var appBase = config["Sys:AppBase"]; _ = mailText.Replace("{name}", name); _ = mailText.Replace("{username}", $"{model.User.Email}"); // Link is the page on the web app, not the api endpoint. var link = $"{appBase}companies/confirm/?token={Uri.EscapeDataString(token)}"; mailText = mailText.Replace("{link}", link); await emailService.SendAsync(model.User.Email, mailText, "Please confirm your registration - HealthImpact Appointments Portal", emailOptions.Value); }