diff options
| -rw-r--r-- | ExamTemplate/Data/Repositories/UserRepository.cs | 13 | ||||
| -rw-r--r-- | ExamTemplate/Services/Models/LoginUserServiceModel.cs | 8 | ||||
| -rw-r--r-- | ExamTemplate/Services/Services.csproj | 1 | ||||
| -rw-r--r-- | ExamTemplate/Services/UserService.cs | 14 | ||||
| -rw-r--r-- | ExamTemplate/Web/Configurations/UserMappings.cs | 1 | ||||
| -rw-r--r-- | ExamTemplate/Web/Controllers/UserController.cs | 21 | ||||
| -rw-r--r-- | ExamTemplate/Web/Models/User/LoginUserViewModel.cs | 8 | ||||
| -rw-r--r-- | ExamTemplate/Web/Views/Shared/_Navbar.cshtml | 18 | ||||
| -rw-r--r-- | ExamTemplate/Web/Views/User/Login.cshtml | 10 | ||||
| -rw-r--r-- | ExamTemplate/Web/Views/_ViewImports.cshtml | 5 |
10 files changed, 94 insertions, 5 deletions
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<User> GetByUsernameAsync(string username) + { + return await this._userManager.Users + .Include(x => x.Roles) + .FirstOrDefaultAsync(x => x.UserName == username); + } + public async Task<bool> 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<bool> 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 @@ <ItemGroup> <PackageReference Include="Automapper" Version="10.1.1" /> + <PackageReference Include="Microsoft.AspNetCore.Identity" Version="2.2.0" /> </ItemGroup>
<PropertyGroup>
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<User> _signInManager;
- public UserService(IMapper autoMapper, UserRepository userRepository)
+ public UserService(IMapper autoMapper, UserRepository userRepository, SignInManager<User> signInManager)
{
this._autoMapper = autoMapper;
this._userRepository = userRepository;
+ this._signInManager = signInManager;
}
public async Task<bool> RegisterUserAsync(RegisterUserServiceModel registerUserServiceModel)
@@ -26,5 +29,14 @@ namespace ExamTemplate.Services return userCreateResult && addRoleResult;
}
+
+ public async Task<bool> 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<RegisterUserViewModel, RegisterUserServiceModel>(); + CreateMap<LoginUserViewModel, LoginUserServiceModel>(); } } } 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<IActionResult> Login(LoginUserViewModel loginUserViewModel) + { + LoginUserServiceModel loginUserServiceModel = this._autoMapper.Map<LoginUserServiceModel>(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<User> SignInManager +@inject UserManager<User> UserManager + <nav class="navbar border-bottom box-shadow"> <div class="middle-content-container navbar-contents"> <section> <b> <a asp-controller="Home" asp-action="Index">Web</a> </b> + <a asp-controller="Home" asp-action="Index">Home</a> + <a asp-controller="Home" asp-action="Privacy">Privacy</a> </section> <div class="flex-spacer"></div> <section> - <a asp-controller="Home" asp-action="Index">Home</a> - <a asp-controller="Home" asp-action="Privacy">Privacy</a> + @if (SignInManager.IsSignedIn(User)) + { + <a asp-controller="User" asp-action="">@UserManager.GetUserName(User)</a> + } + else + { + <a asp-controller="User" asp-action="Login">Login</a> + <a asp-controller="User" asp-action="Register">Register</a> + } </section> </div> </nav> 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"; +} + +<form asp-controller="User" asp-action="Login" method="post"> + <input type="text" asp-for="Username" placeholder="Username"> + <input type="password" asp-for="Password" placeholder="Password"> + <input type="submit"> +</form> 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
|
