diff --git a/SeniorAssistant/Controllers/AccountController.cs b/SeniorAssistant/Controllers/AccountController.cs new file mode 100644 index 0000000..744ab7a --- /dev/null +++ b/SeniorAssistant/Controllers/AccountController.cs @@ -0,0 +1,207 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; + +namespace IdentityDemo.Controllers +{ + + [ApiExplorerSettings(IgnoreApi = true)] + [Route("[controller]/[action]")] + public class AccountController : Controller + { + /* + private readonly UserManager _userManager; + private readonly SignInManager _signInManager; + private readonly ILogger _logger; + + public AccountController( + UserManager userManager, + SignInManager signInManager, + ILogger logger) + { + _userManager = userManager; + _signInManager = signInManager; + _logger = logger; + } + /* + [TempData] + public string ErrorMessage { get; set; } + + [HttpGet] + [AllowAnonymous] + public async Task Login(string returnUrl = null) + { + // Clear the existing external cookie to ensure a clean login process + await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme); + + ViewData["ReturnUrl"] = returnUrl; + return View(); + } + */ + + [HttpPost] + public ActionResult _login(string username, string password, bool rememberMe) + { + var result = username != null && password != null && username.Equals("acc1") && password.Equals("123"); //await _signInManager.PasswordSignInAsync(userName, password, rememberMe, lockoutOnFailure: false); + JsonResponse response = new JsonResponse(); + response.Success = false; + response.Message = "Username or password is invalid."; + + if (result) + { + var loggedUser = HttpContext.Session.GetString("username"); + if (loggedUser==null || !loggedUser.Equals(username)) + { + HttpContext.Session.SetString("username", username); + response.Success = true; + response.Message = ""; + } + else + { + response.Message = "User already logged"; + } + } + return Json(response); + } + + public ActionResult _logout() + { + HttpContext.Session.Clear(); + return Json(new JsonResponse()); + } + + internal class JsonResponse + { + public bool Success { get; internal set; } + public string Message { get; internal set; } + } + /* + [HttpPost] + [AllowAnonymous] + [ValidateAntiForgeryToken] + public async Task Login(LoginViewModel model, string returnUrl = null) + { + ViewData["ReturnUrl"] = returnUrl; + if (ModelState.IsValid) + { + // This doesn't count login failures towards account lockout + // To enable password failures to trigger account lockout, set lockoutOnFailure: true + var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false); + if (result.Succeeded) + { + _logger.LogInformation("User logged in."); + return RedirectToLocal(returnUrl); + } + if (result.IsLockedOut) + { + _logger.LogWarning("User account locked out."); + return RedirectToAction(nameof(Lockout)); + } + else + { + ModelState.AddModelError(string.Empty, "Invalid login attempt."); + return View(model); + } + } + + // If we got this far, something failed, redisplay form + return View(model); + } + + [HttpGet] + [AllowAnonymous] + public IActionResult Lockout() + { + return View(); + } + + [HttpGet] + [AllowAnonymous] + public IActionResult Register(string returnUrl = null) + { + ViewData["ReturnUrl"] = returnUrl; + return View(); + } + + [HttpPost] + [AllowAnonymous] + [ValidateAntiForgeryToken] + public async Task Register(RegisterViewModel model, string returnUrl = null) + { + ViewData["ReturnUrl"] = returnUrl; + if (ModelState.IsValid) + { + var user = new User { UserName = model.Email, Email = model.Email }; + var result = await _userManager.CreateAsync(user, model.Password); + if (result.Succeeded) + { + await _signInManager.SignInAsync(user, isPersistent: false); + _logger.LogInformation("User created a new account with password."); + return RedirectToLocal(returnUrl); + } + AddErrors(result); + } + + // If we got this far, something failed, redisplay form + return View(model); + } + + [HttpPost] + [ValidateAntiForgeryToken] + public async Task Logout() + { + await _signInManager.SignOutAsync(); + _logger.LogInformation("User logged out."); + return RedirectToAction(nameof(HomeController.Index), "Home"); + } + + [HttpGet] + [AllowAnonymous] + public async Task ConfirmEmail(string userId, string code) + { + if (userId == null || code == null) + { + return RedirectToAction(nameof(HomeController.Index), "Home"); + } + var user = await _userManager.FindByIdAsync(userId); + if (user == null) + { + throw new ApplicationException($"Unable to load user with ID '{userId}'."); + } + var result = await _userManager.ConfirmEmailAsync(user, code); + return View(result.Succeeded ? "ConfirmEmail" : "Error"); + } + + [HttpGet] + public IActionResult AccessDenied() + { + return View(); + } + + #region Helpers + + private void AddErrors(IdentityResult result) + { + foreach (var error in result.Errors) + { + ModelState.AddModelError(string.Empty, error.Description); + } + } + + private IActionResult RedirectToLocal(string returnUrl) + { + if (Url.IsLocalUrl(returnUrl)) + { + return Redirect(returnUrl); + } + else + { + return RedirectToAction(nameof(HomeController.Index), "Home"); + } + } + + #endregion + */ + } +} \ No newline at end of file diff --git a/SeniorAssistant/Controllers/HomeController.cs b/SeniorAssistant/Controllers/HomeController.cs index 6c081ea..56a2439 100644 --- a/SeniorAssistant/Controllers/HomeController.cs +++ b/SeniorAssistant/Controllers/HomeController.cs @@ -1,10 +1,17 @@ -using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; namespace SeniorAssistant.Controllers { [ApiExplorerSettings(IgnoreApi = true)] public class HomeController : Controller { + private readonly ISession session; + public HomeController(IHttpContextAccessor httpContextAccessor) + { + this.session = httpContextAccessor.HttpContext.Session; + } + [Route("")] [Route("Home")] [Route("Index")] @@ -31,7 +38,7 @@ namespace SeniorAssistant.Controllers return View(); } - [Route("{User}")] + [Route("User/{User}")] public IActionResult SingleUser(string user) { return View("user", user); diff --git a/SeniorAssistant/Models/User.cs b/SeniorAssistant/Models/User.cs index 2cd522b..44856fb 100644 --- a/SeniorAssistant/Models/User.cs +++ b/SeniorAssistant/Models/User.cs @@ -1,4 +1,5 @@ using LinqToDB.Mapping; +using Microsoft.AspNetCore.Identity; namespace SeniorAssistant.Models { diff --git a/SeniorAssistant/SeniorAssistant.csproj b/SeniorAssistant/SeniorAssistant.csproj index dcde378..3fb5c1f 100644 --- a/SeniorAssistant/SeniorAssistant.csproj +++ b/SeniorAssistant/SeniorAssistant.csproj @@ -11,13 +11,13 @@ - + - + - - - + + + diff --git a/SeniorAssistant/Startup.cs b/SeniorAssistant/Startup.cs index 6166364..204d43e 100644 --- a/SeniorAssistant/Startup.cs +++ b/SeniorAssistant/Startup.cs @@ -13,6 +13,8 @@ using SeniorAssistant.Data; using SeniorAssistant.Models; using SeniorAssistant.Extensions; using Swashbuckle.AspNetCore.Swagger; +using Microsoft.AspNetCore.Identity; +using Microsoft.Extensions.DependencyInjection.Extensions; namespace SeniorAssistant { @@ -30,6 +32,7 @@ namespace SeniorAssistant public void ConfigureServices(IServiceCollection services) { services.AddMvc(); + services.AddSession(); services.AddSwaggerGen(c => { @@ -51,6 +54,7 @@ namespace SeniorAssistant services.Configure(Configuration.GetSection("kendo")); services.Configure(Configuration.GetSection("theme")); + services.TryAddSingleton(); services.AddSingleton>(new IMenuItem[] { new SubMenu @@ -81,8 +85,10 @@ namespace SeniorAssistant if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); + app.UseDatabaseErrorPage(); } - + + app.UseSession(); app.UseStaticFiles(); // Enable middleware to serve generated Swagger as a JSON endpoint. diff --git a/SeniorAssistant/Views/Home/Index.cshtml b/SeniorAssistant/Views/Home/Index.cshtml index 3ecf97b..4c30ece 100644 --- a/SeniorAssistant/Views/Home/Index.cshtml +++ b/SeniorAssistant/Views/Home/Index.cshtml @@ -41,7 +41,8 @@ editable: false, columns: [ { field: "username", title: "Username" }, - { field: "name", title: "Name" } /*, + { field: "name", title: "Name" }, + { field: "url", title: "",template:'Vedi Dati'}/*, { field: "time", title: "Date/Time", format: "{dd/MM/yyyy HH}" }, { field: "value", title: "Heartbeats" } */ diff --git a/SeniorAssistant/Views/Shared/Login.cshtml b/SeniorAssistant/Views/Shared/Login.cshtml new file mode 100644 index 0000000..d61cf90 --- /dev/null +++ b/SeniorAssistant/Views/Shared/Login.cshtml @@ -0,0 +1,34 @@ +
+ + + + +
+ + \ No newline at end of file diff --git a/SeniorAssistant/Views/Shared/Logout.cshtml b/SeniorAssistant/Views/Shared/Logout.cshtml new file mode 100644 index 0000000..30351db --- /dev/null +++ b/SeniorAssistant/Views/Shared/Logout.cshtml @@ -0,0 +1,19 @@ +
+ +
+ + \ No newline at end of file diff --git a/SeniorAssistant/Views/Shared/NavbarRightMenu.cshtml b/SeniorAssistant/Views/Shared/NavbarRightMenu.cshtml index 40059ee..75ee5d9 100644 --- a/SeniorAssistant/Views/Shared/NavbarRightMenu.cshtml +++ b/SeniorAssistant/Views/Shared/NavbarRightMenu.cshtml @@ -1,4 +1,10 @@ -