3 changed files with 136 additions and 52 deletions
@ -0,0 +1,37 @@ |
|||||
|
@page |
||||
|
@model RegisterModel |
||||
|
@{ |
||||
|
ViewData["Title"] = "Register"; |
||||
|
} |
||||
|
|
||||
|
<h2>@ViewData["Title"]</h2> |
||||
|
|
||||
|
<div class="row"> |
||||
|
<div class="col-md-4"> |
||||
|
<form asp-route-returnUrl="@Model.ReturnUrl" method="post"> |
||||
|
<h4>Create a new account.</h4> |
||||
|
<hr /> |
||||
|
<div asp-validation-summary="All" class="text-danger"></div> |
||||
|
<div class="form-group"> |
||||
|
<label asp-for="Input.Email"></label> |
||||
|
<input asp-for="Input.Email" class="form-control" /> |
||||
|
<span asp-validation-for="Input.Email" class="text-danger"></span> |
||||
|
</div> |
||||
|
<div class="form-group"> |
||||
|
<label asp-for="Input.Password"></label> |
||||
|
<input asp-for="Input.Password" class="form-control" /> |
||||
|
<span asp-validation-for="Input.Password" class="text-danger"></span> |
||||
|
</div> |
||||
|
<div class="form-group"> |
||||
|
<label asp-for="Input.ConfirmPassword"></label> |
||||
|
<input asp-for="Input.ConfirmPassword" class="form-control" /> |
||||
|
<span asp-validation-for="Input.ConfirmPassword" class="text-danger"></span> |
||||
|
</div> |
||||
|
<button type="submit" class="btn btn-default">Register</button> |
||||
|
</form> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
@section Scripts { |
||||
|
<partial name="_ValidationScriptsPartial" /> |
||||
|
} |
||||
@ -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<ApplicationUser> _signInManager; |
||||
|
private readonly UserManager<ApplicationUser> _userManager; |
||||
|
private readonly ILogger<RegisterModel> _logger; |
||||
|
private readonly IEmailSender _emailSender; |
||||
|
|
||||
|
public RegisterModel( |
||||
|
UserManager<ApplicationUser> userManager, |
||||
|
SignInManager<ApplicationUser> signInManager, |
||||
|
ILogger<RegisterModel> 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<IActionResult> 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 <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>."); |
||||
|
|
||||
|
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(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -1,52 +0,0 @@ |
|||||
@model RegisterViewModel |
|
||||
@{ |
|
||||
ViewData["Title"] = "Register"; |
|
||||
} |
|
||||
<div class="brand-header-block"> |
|
||||
<ul class="container"> |
|
||||
<li class="active" style="margin-right: 65px;">Already have an account? <a asp-action="Signin">LOGIN</a></li> |
|
||||
</ul> |
|
||||
</div> |
|
||||
<div class="container account-login-container"> |
|
||||
<div class="row"> |
|
||||
<div class="col-md-12"> |
|
||||
<section> |
|
||||
<form asp-controller="Account" asp-route-returnurl="@ViewData["ReturnUrl"]" method="post" class="form-horizontal"> |
|
||||
<div asp-validation-summary="All" class="text-danger"></div> |
|
||||
<div class="form-group"> |
|
||||
<label asp-for="Email" class="col-md-2 control-label"></label> |
|
||||
<div class="col-md-10"> |
|
||||
<input asp-for="Email" class="form-control" /> |
|
||||
<span asp-validation-for="Email" class="text-danger"></span> |
|
||||
</div> |
|
||||
</div> |
|
||||
<div class="form-group"> |
|
||||
<label asp-for="Password" class="col-md-2 control-label"></label> |
|
||||
<div class="col-md-10"> |
|
||||
<input asp-for="Password" class="form-control" /> |
|
||||
<span asp-validation-for="Password" class="text-danger"></span> |
|
||||
</div> |
|
||||
</div> |
|
||||
<div class="form-group"> |
|
||||
<label asp-for="ConfirmPassword" class="col-md-2 control-label"></label> |
|
||||
<div class="col-md-10"> |
|
||||
<input asp-for="ConfirmPassword" class="form-control" /> |
|
||||
<span asp-validation-for="ConfirmPassword" class="text-danger"></span> |
|
||||
</div> |
|
||||
</div> |
|
||||
<div class="form-group"> |
|
||||
<button type="submit" class="btn btn-default btn-brand btn-brand-big"> REGISTER </button> |
|
||||
</div> |
|
||||
<p> |
|
||||
Note that for demo purposes you don't need to register! Use the credentials shown below the |
|
||||
<a asp-action="signin">login screen</a>. |
|
||||
</p> |
|
||||
</form> |
|
||||
</section> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
@section Scripts { |
|
||||
@{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); } |
|
||||
} |
|
||||
Loading…
Reference in new issue