From cabbcc1ef8f3ab711371eec6a65c255e61de413a Mon Sep 17 00:00:00 2001 From: Syndamia Date: Thu, 6 May 2021 22:29:54 +0300 Subject: Impllemented user login and updated navbar --- ExamTemplate/Data/Repositories/UserRepository.cs | 13 +++++++++++++ .../Services/Models/LoginUserServiceModel.cs | 8 ++++++++ ExamTemplate/Services/Services.csproj | 1 + ExamTemplate/Services/UserService.cs | 14 +++++++++++++- ExamTemplate/Web/Configurations/UserMappings.cs | 1 + ExamTemplate/Web/Controllers/UserController.cs | 21 +++++++++++++++++++++ ExamTemplate/Web/Models/User/LoginUserViewModel.cs | 8 ++++++++ ExamTemplate/Web/Views/Shared/_Navbar.cshtml | 18 ++++++++++++++++-- ExamTemplate/Web/Views/User/Login.cshtml | 10 ++++++++++ ExamTemplate/Web/Views/_ViewImports.cshtml | 5 +++-- 10 files changed, 94 insertions(+), 5 deletions(-) create mode 100644 ExamTemplate/Services/Models/LoginUserServiceModel.cs create mode 100644 ExamTemplate/Web/Models/User/LoginUserViewModel.cs create mode 100644 ExamTemplate/Web/Views/User/Login.cshtml diff --git a/ExamTemplate/Data/Repositories/UserRepository.cs b/ExamTemplate/Data/Repositories/UserRepository.cs index 97eb21b..04e1f45 100644 --- a/ExamTemplate/Data/Repositories/UserRepository.cs +++ b/ExamTemplate/Data/Repositories/UserRepository.cs @@ -1,6 +1,7 @@ using System.Threading.Tasks; using ExamTemplate.Data.Models; using Microsoft.AspNetCore.Identity; +using Microsoft.EntityFrameworkCore; namespace ExamTemplate.Data.Repositories { @@ -17,6 +18,13 @@ namespace ExamTemplate.Data.Repositories this._roleManager = roleManager; } + public async Task GetByUsernameAsync(string username) + { + return await this._userManager.Users + .Include(x => x.Roles) + .FirstOrDefaultAsync(x => x.UserName == username); + } + public async Task AddAsync(User user, string password) { user.PasswordHash = this._userManager.PasswordHasher.HashPassword(user, password); @@ -36,5 +44,10 @@ namespace ExamTemplate.Data.Repositories return succeeded; } + + public async Task VerifyPasswordAsync(User user, string password) + { + return await this._userManager.CheckPasswordAsync(user, password); + } } } diff --git a/ExamTemplate/Services/Models/LoginUserServiceModel.cs b/ExamTemplate/Services/Models/LoginUserServiceModel.cs new file mode 100644 index 0000000..1d8a2f8 --- /dev/null +++ b/ExamTemplate/Services/Models/LoginUserServiceModel.cs @@ -0,0 +1,8 @@ +namespace ExamTemplate.Services.Models +{ + public class LoginUserServiceModel + { + public string Username { get; set; } + public string Password { get; set; } + } +} diff --git a/ExamTemplate/Services/Services.csproj b/ExamTemplate/Services/Services.csproj index bac932a..9383013 100644 --- a/ExamTemplate/Services/Services.csproj +++ b/ExamTemplate/Services/Services.csproj @@ -7,6 +7,7 @@ + diff --git a/ExamTemplate/Services/UserService.cs b/ExamTemplate/Services/UserService.cs index 848edf6..f8075f5 100644 --- a/ExamTemplate/Services/UserService.cs +++ b/ExamTemplate/Services/UserService.cs @@ -3,6 +3,7 @@ using AutoMapper; using ExamTemplate.Data.Models; using ExamTemplate.Data.Repositories; using ExamTemplate.Services.Models; +using Microsoft.AspNetCore.Identity; namespace ExamTemplate.Services { @@ -10,11 +11,13 @@ namespace ExamTemplate.Services { private readonly IMapper _autoMapper; private readonly UserRepository _userRepository; + private readonly SignInManager _signInManager; - public UserService(IMapper autoMapper, UserRepository userRepository) + public UserService(IMapper autoMapper, UserRepository userRepository, SignInManager signInManager) { this._autoMapper = autoMapper; this._userRepository = userRepository; + this._signInManager = signInManager; } public async Task RegisterUserAsync(RegisterUserServiceModel registerUserServiceModel) @@ -26,5 +29,14 @@ namespace ExamTemplate.Services return userCreateResult && addRoleResult; } + + public async Task LoginUserAsync(LoginUserServiceModel loginUserServiceModel) + { + User user = await this._userRepository.GetByUsernameAsync(loginUserServiceModel.Username); + + var result = await this._signInManager.PasswordSignInAsync(loginUserServiceModel.Username, loginUserServiceModel.Password, false, false); + + return result.Succeeded; + } } } diff --git a/ExamTemplate/Web/Configurations/UserMappings.cs b/ExamTemplate/Web/Configurations/UserMappings.cs index d1a5523..37476ed 100644 --- a/ExamTemplate/Web/Configurations/UserMappings.cs +++ b/ExamTemplate/Web/Configurations/UserMappings.cs @@ -9,6 +9,7 @@ namespace ExamTemplate.Services.Configurations public UserMappings() { CreateMap(); + CreateMap(); } } } diff --git a/ExamTemplate/Web/Controllers/UserController.cs b/ExamTemplate/Web/Controllers/UserController.cs index cd472de..f4b6edf 100644 --- a/ExamTemplate/Web/Controllers/UserController.cs +++ b/ExamTemplate/Web/Controllers/UserController.cs @@ -38,5 +38,26 @@ namespace ExamTemplate.Web.Controllers else return View(); } + + [HttpGet] + [Route("/Login")] + public IActionResult Login() + { + return View(); + } + + [HttpPost] + [Route("/Login")] + public async Task Login(LoginUserViewModel loginUserViewModel) + { + LoginUserServiceModel loginUserServiceModel = this._autoMapper.Map(loginUserViewModel); + + bool result = await this._userService.LoginUserAsync(loginUserServiceModel); + + if (result) + return RedirectToAction("Index", "Home"); + else + return View(); + } } } diff --git a/ExamTemplate/Web/Models/User/LoginUserViewModel.cs b/ExamTemplate/Web/Models/User/LoginUserViewModel.cs new file mode 100644 index 0000000..6430183 --- /dev/null +++ b/ExamTemplate/Web/Models/User/LoginUserViewModel.cs @@ -0,0 +1,8 @@ +namespace ExamTemplate.Web.Models.User +{ + public class LoginUserViewModel + { + public string Username { get; set; } + public string Password { get; set; } + } +} diff --git a/ExamTemplate/Web/Views/Shared/_Navbar.cshtml b/ExamTemplate/Web/Views/Shared/_Navbar.cshtml index f81d082..f60b799 100644 --- a/ExamTemplate/Web/Views/Shared/_Navbar.cshtml +++ b/ExamTemplate/Web/Views/Shared/_Navbar.cshtml @@ -1,14 +1,28 @@ +@using Microsoft.AspNetCore.Identity + +@inject SignInManager SignInManager +@inject UserManager UserManager + diff --git a/ExamTemplate/Web/Views/User/Login.cshtml b/ExamTemplate/Web/Views/User/Login.cshtml new file mode 100644 index 0000000..8df3013 --- /dev/null +++ b/ExamTemplate/Web/Views/User/Login.cshtml @@ -0,0 +1,10 @@ +@model ExamTemplate.Web.Models.User.LoginUserViewModel +@{ + ViewData["Title"] = "Login"; +} + +
+ + + +
diff --git a/ExamTemplate/Web/Views/_ViewImports.cshtml b/ExamTemplate/Web/Views/_ViewImports.cshtml index bf79573..fcc5117 100644 --- a/ExamTemplate/Web/Views/_ViewImports.cshtml +++ b/ExamTemplate/Web/Views/_ViewImports.cshtml @@ -1,3 +1,4 @@ -@using Web -@using Web.Models +@using ExamTemplate.Web +@using ExamTemplate.Web.Models +@using ExamTemplate.Data.Models @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers -- cgit v1.2.3