From a3d27403a92c8d5e666a775c4ba32c5c485320a6 Mon Sep 17 00:00:00 2001 From: TitovPavel <52369020+TitovPavel@users.noreply.github.com> Date: Mon, 20 Jan 2020 01:03:00 +0300 Subject: [PATCH 01/10] AddConfirmEmail --- BlogIT.DB/BL/EmailService.cs | 31 +++++++++++ BlogIT.DB/BL/IEmailService.cs | 9 ++++ BlogIT.DB/BlogIT.DB.csproj | 1 + BlogIT.MVC/Controllers/AccountController.cs | 56 ++++++++++++++++++-- BlogIT.MVC/Startup.cs | 6 ++- BlogIT.MVC/Views/Account/Confirm.cshtml | 20 +++++++ BlogIT.MVC/Views/Home/Index.cshtml | 4 +- BlogIT.MVC/Views/Shared/_LoginPartial.cshtml | 12 ++--- BlogIT.MVC/wwwroot/js/site.js | 38 +++++++++---- 9 files changed, 154 insertions(+), 23 deletions(-) create mode 100644 BlogIT.DB/BL/EmailService.cs create mode 100644 BlogIT.DB/BL/IEmailService.cs create mode 100644 BlogIT.MVC/Views/Account/Confirm.cshtml diff --git a/BlogIT.DB/BL/EmailService.cs b/BlogIT.DB/BL/EmailService.cs new file mode 100644 index 0000000..2525448 --- /dev/null +++ b/BlogIT.DB/BL/EmailService.cs @@ -0,0 +1,31 @@ +using MimeKit; +using MailKit.Net.Smtp; +using System.Threading.Tasks; + +namespace BlogIT.DB.BL +{ + public class EmailService : IEmailService + { + public async Task SendEmailAsync(string email, string subject, string message) + { + var emailMessage = new MimeMessage(); + + emailMessage.From.Add(new MailboxAddress("Администрация сайта", "JIeHIH12345@mail.ru")); + emailMessage.To.Add(new MailboxAddress("", email)); + emailMessage.Subject = subject; + emailMessage.Body = new TextPart(MimeKit.Text.TextFormat.Html) + { + Text = message + }; + + using (var client = new SmtpClient()) + { + await client.ConnectAsync("smtp.mail.ru", 25, false); + await client.AuthenticateAsync("JIeHIH12345@mail.ru", "*********"); + await client.SendAsync(emailMessage); + + await client.DisconnectAsync(true); + } + } + } +} diff --git a/BlogIT.DB/BL/IEmailService.cs b/BlogIT.DB/BL/IEmailService.cs new file mode 100644 index 0000000..b5020bd --- /dev/null +++ b/BlogIT.DB/BL/IEmailService.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; + +namespace BlogIT.DB.BL +{ + public interface IEmailService + { + Task SendEmailAsync(string email, string subject, string message); + } +} diff --git a/BlogIT.DB/BlogIT.DB.csproj b/BlogIT.DB/BlogIT.DB.csproj index af7e06e..3706415 100644 --- a/BlogIT.DB/BlogIT.DB.csproj +++ b/BlogIT.DB/BlogIT.DB.csproj @@ -20,6 +20,7 @@ + diff --git a/BlogIT.MVC/Controllers/AccountController.cs b/BlogIT.MVC/Controllers/AccountController.cs index 5dfefc1..9c45547 100644 --- a/BlogIT.MVC/Controllers/AccountController.cs +++ b/BlogIT.MVC/Controllers/AccountController.cs @@ -20,18 +20,21 @@ public class AccountController : Controller private readonly IMapper _mapper; private readonly IStringLocalizer _localizer; private readonly IPhotoService _photoService; + private readonly IEmailService _emailService; public AccountController(UserManager userManager, SignInManager signInManager, IMapper mapper, IStringLocalizer localizer, - IPhotoService photoService) + IPhotoService photoService, + IEmailService emailService) { _userManager = userManager; _signInManager = signInManager; _mapper = mapper; _localizer = localizer; _photoService = photoService; + _emailService = emailService; } [HttpGet] @@ -58,8 +61,18 @@ public async Task Register(RegisterViewModel registerViewModel) var gender = new Claim(ClaimTypes.Gender, registerViewModel.Sex.ToString(), typeof(String).ToString()); await _userManager.AddClaimAsync(user, gender); - await _signInManager.SignInAsync(user, false); - return RedirectToAction("Index", "Home"); + string code = await _userManager.GenerateEmailConfirmationTokenAsync(user); + var callbackUrl = Url.Action( + "ConfirmEmail", + "Account", + new { userId = user.Id, code = code }, + protocol: HttpContext.Request.Scheme); + + await _emailService.SendEmailAsync(user.Email, "Confirm your account", + $"Подтвердите регистрацию, перейдя по ссылке: link"); + + return RedirectToAction("Confirm", "Account"); + } else { @@ -72,6 +85,32 @@ public async Task Register(RegisterViewModel registerViewModel) return View(registerViewModel); } + [HttpGet] + public IActionResult Confirm() + { + return View(); + } + + [HttpGet] + [AllowAnonymous] + public async Task ConfirmEmail(string userId, string code) + { + if (userId == null || code == null) + { + return View("Error"); + } + var user = await _userManager.FindByIdAsync(userId); + if (user == null) + { + return View("Error"); + } + var result = await _userManager.ConfirmEmailAsync(user, code); + if (result.Succeeded) + return RedirectToAction("Index", "Home"); + else + return View("Error"); + } + [HttpGet] public IActionResult Login() { @@ -84,6 +123,17 @@ public async Task Login(LoginViewModel model) { if (ModelState.IsValid) { + + var user = await _userManager.FindByNameAsync(model.Name); + if (user != null) + { + if (!await _userManager.IsEmailConfirmedAsync(user)) + { + ModelState.AddModelError(string.Empty, "Вы не подтвердили свой email"); + return View(model); + } + } + var result = await _signInManager.PasswordSignInAsync(model.Name, model.Password, model.RememberMe, false); if (result.Succeeded) diff --git a/BlogIT.MVC/Startup.cs b/BlogIT.MVC/Startup.cs index 90726d0..ffdf16b 100644 --- a/BlogIT.MVC/Startup.cs +++ b/BlogIT.MVC/Startup.cs @@ -36,12 +36,14 @@ public void ConfigureServices(IServiceCollection services) options.UseSqlServer(Configuration.GetConnectionString("BlogITDatabase"))); services.AddIdentity() - .AddEntityFrameworkStores(); + .AddEntityFrameworkStores() + .AddDefaultTokenProviders(); services.AddTransient(); services.AddTransient(); services.AddTransient(); - + services.AddTransient(); + services.AddAutoMapper(typeof(Mappings.MappingProfile)); services.AddAuthorization(); diff --git a/BlogIT.MVC/Views/Account/Confirm.cshtml b/BlogIT.MVC/Views/Account/Confirm.cshtml new file mode 100644 index 0000000..642af62 --- /dev/null +++ b/BlogIT.MVC/Views/Account/Confirm.cshtml @@ -0,0 +1,20 @@ +@{ + ViewData["Title"] = @Localizer["Title"]; +} + + + +
+
+
+ +
+
+

@Localizer["Для завершения регистрации проверьте электронную почту и перейдите по ссылке, указанной в письме"]

+
+
+
+
+
\ No newline at end of file diff --git a/BlogIT.MVC/Views/Home/Index.cshtml b/BlogIT.MVC/Views/Home/Index.cshtml index 318412a..244154a 100644 --- a/BlogIT.MVC/Views/Home/Index.cshtml +++ b/BlogIT.MVC/Views/Home/Index.cshtml @@ -14,7 +14,7 @@
-

@Localizer["LastNews"]

+

@Localizer["LastNews"]

@@ -30,7 +30,7 @@
-

@Localizer["TopNews"]

+

@Localizer["TopNews"]

diff --git a/BlogIT.MVC/Views/Shared/_LoginPartial.cshtml b/BlogIT.MVC/Views/Shared/_LoginPartial.cshtml index 19639d3..629a270 100644 --- a/BlogIT.MVC/Views/Shared/_LoginPartial.cshtml +++ b/BlogIT.MVC/Views/Shared/_LoginPartial.cshtml @@ -19,13 +19,13 @@ -