aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ExamTemplate/Data/Repositories/UserRepository.cs13
-rw-r--r--ExamTemplate/Services/Models/LoginUserServiceModel.cs8
-rw-r--r--ExamTemplate/Services/Services.csproj1
-rw-r--r--ExamTemplate/Services/UserService.cs14
-rw-r--r--ExamTemplate/Web/Configurations/UserMappings.cs1
-rw-r--r--ExamTemplate/Web/Controllers/UserController.cs21
-rw-r--r--ExamTemplate/Web/Models/User/LoginUserViewModel.cs8
-rw-r--r--ExamTemplate/Web/Views/Shared/_Navbar.cshtml18
-rw-r--r--ExamTemplate/Web/Views/User/Login.cshtml10
-rw-r--r--ExamTemplate/Web/Views/_ViewImports.cshtml5
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