/****************************************************************************** // Canary Islands Computer Museum Website // ---------------------------------------------------------------------------- // // Filename : Register.cshtml.cs // Author(s) : Natalia Portillo // // --[ Description ] ---------------------------------------------------------- // // ASP.NET Identify management // // --[ License ] -------------------------------------------------------------- // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as // published by the Free Software Foundation, either version 3 of the // License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // ---------------------------------------------------------------------------- // Copyright © 2003-2018 Natalia Portillo *******************************************************************************/ using System.ComponentModel.DataAnnotations; using System.Text.Encodings.Web; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity.UI.Services; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.Logging; namespace cicm_web.Areas.Identity.Pages.Account { [AllowAnonymous] public class RegisterModel : PageModel { readonly IEmailSender _emailSender; readonly ILogger _logger; readonly SignInManager _signInManager; readonly UserManager _userManager; public RegisterModel(UserManager userManager, SignInManager signInManager, ILogger logger, IEmailSender emailSender) { _userManager = userManager; _signInManager = signInManager; _logger = logger; _emailSender = emailSender; } [BindProperty] public InputModel Input { get; set; } public string ReturnUrl { get; set; } public void OnGet(string returnUrl = null) { ReturnUrl = returnUrl; } public async Task OnPostAsync(string returnUrl = null) { returnUrl = returnUrl ?? Url.Content("~/"); if(ModelState.IsValid) { IdentityUser user = new IdentityUser {UserName = Input.Email, Email = Input.Email}; IdentityResult result = await _userManager.CreateAsync(user, Input.Password); if(result.Succeeded) { _logger.LogInformation("User created a new account with password."); string code = await _userManager.GenerateEmailConfirmationTokenAsync(user); string callbackUrl = Url.Page("/Account/ConfirmEmail", null, new {userId = user.Id, code}, Request.Scheme); await _emailSender.SendEmailAsync(Input.Email, "Confirm your email", $"Please confirm your account by clicking here."); await _signInManager.SignInAsync(user, false); return LocalRedirect(returnUrl); } foreach(IdentityError error in result.Errors) ModelState.AddModelError(string.Empty, error.Description); } // If we got this far, something failed, redisplay form return Page(); } public class InputModel { [Required] [EmailAddress] [Display(Name = "Email")] public string Email { get; set; } [Required] [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)] [DataType(DataType.Password)] [Display(Name = "Password")] public string Password { get; set; } [DataType(DataType.Password)] [Display(Name = "Confirm password")] [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] public string ConfirmPassword { get; set; } } } }