diff --git a/src/Web/Areas/Identity/Pages/Account/Register.cshtml b/src/Web/Areas/Identity/Pages/Account/Register.cshtml
new file mode 100644
index 000000000..cc6783bb3
--- /dev/null
+++ b/src/Web/Areas/Identity/Pages/Account/Register.cshtml
@@ -0,0 +1,41 @@
+@page
+@model RegisterModel
+@{
+ ViewData["Title"] = "Register";
+}
+
+
+
+
@ViewData["Title"]
+
+
+
+
+
+@section Scripts {
+
+}
diff --git a/src/Web/Areas/Identity/Pages/Account/Register.cshtml.cs b/src/Web/Areas/Identity/Pages/Account/Register.cshtml.cs
new file mode 100644
index 000000000..d2ea1792a
--- /dev/null
+++ b/src/Web/Areas/Identity/Pages/Account/Register.cshtml.cs
@@ -0,0 +1,99 @@
+using System;
+using System.Collections.Generic;
+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.eShopWeb.Infrastructure.Identity;
+using Microsoft.Extensions.Logging;
+
+namespace Microsoft.eShopWeb.Web.Areas.Identity.Pages.Account
+{
+ [AllowAnonymous]
+ public class RegisterModel : PageModel
+ {
+ private readonly SignInManager _signInManager;
+ private readonly UserManager _userManager;
+ private readonly ILogger _logger;
+ private readonly IEmailSender _emailSender;
+
+ 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 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; }
+ }
+
+ public void OnGet(string returnUrl = null)
+ {
+ ReturnUrl = returnUrl;
+ }
+
+ public async Task OnPostAsync(string returnUrl = null)
+ {
+ returnUrl = returnUrl ?? Url.Content("~/");
+ if (ModelState.IsValid)
+ {
+ var user = new ApplicationUser { UserName = Input.Email, Email = Input.Email };
+ var result = await _userManager.CreateAsync(user, Input.Password);
+ if (result.Succeeded)
+ {
+ _logger.LogInformation("User created a new account with password.");
+
+ var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
+ var callbackUrl = Url.Page(
+ "/Account/ConfirmEmail",
+ pageHandler: null,
+ values: new { userId = user.Id, code = code },
+ protocol: Request.Scheme);
+
+ await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
+ $"Please confirm your account by clicking here.");
+
+ await _signInManager.SignInAsync(user, isPersistent: false);
+ return LocalRedirect(returnUrl);
+ }
+ foreach (var error in result.Errors)
+ {
+ ModelState.AddModelError(string.Empty, error.Description);
+ }
+ }
+
+ // If we got this far, something failed, redisplay form
+ return Page();
+ }
+ }
+}
diff --git a/src/Web/Views/Account/Register.cshtml b/src/Web/Views/Account/Register.cshtml
deleted file mode 100644
index 576111e75..000000000
--- a/src/Web/Views/Account/Register.cshtml
+++ /dev/null
@@ -1,52 +0,0 @@
-@model RegisterViewModel
-@{
- ViewData["Title"] = "Register";
-}
-
-
- - Already have an account? LOGIN
-
-
-
-
-@section Scripts {
- @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
-}