189 lines
4.9 KiB
C#
189 lines
4.9 KiB
C#
using System.Security.Claims;
|
|
using System.Threading.Tasks;
|
|
using Microsoft.AspNetCore.Authentication;
|
|
using Microsoft.AspNetCore.Authorization;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
|
using Watcher.Data;
|
|
using Watcher.ViewModels;
|
|
|
|
namespace Watcher.Controllers;
|
|
|
|
public class AuthController : Controller
|
|
{
|
|
private readonly AppDbContext _context;
|
|
|
|
public AuthController(AppDbContext context)
|
|
{
|
|
_context = context;
|
|
}
|
|
|
|
[HttpGet]
|
|
public IActionResult Login(string? returnUrl = null)
|
|
{
|
|
var model = new LoginViewModel
|
|
{
|
|
ReturnUrl = returnUrl
|
|
};
|
|
return View(model);
|
|
}
|
|
|
|
|
|
[HttpPost]
|
|
public async Task<IActionResult> Login(LoginViewModel model)
|
|
{
|
|
if (!ModelState.IsValid)
|
|
return View(model);
|
|
|
|
var user = await _context.Users.FirstOrDefaultAsync(u => u.Username == model.Username);
|
|
if (user == null || !BCrypt.Net.BCrypt.Verify(model.Password, user.Password))
|
|
{
|
|
ModelState.AddModelError("", "Benutzername oder Passwort ist falsch.");
|
|
return View(model);
|
|
}
|
|
|
|
var claims = new List<Claim>
|
|
{
|
|
new Claim(ClaimTypes.Name, user.Username),
|
|
new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
|
|
};
|
|
|
|
var identity = new ClaimsIdentity(claims, "local");
|
|
var principal = new ClaimsPrincipal(identity);
|
|
|
|
await HttpContext.SignInAsync("Cookies", principal);
|
|
|
|
return Redirect("Home/Index");
|
|
}
|
|
|
|
|
|
public IActionResult SignIn()
|
|
{
|
|
return Challenge(new AuthenticationProperties
|
|
{
|
|
RedirectUri = "/Home/Index"
|
|
}, "oidc");
|
|
}
|
|
|
|
[HttpPost]
|
|
[ValidateAntiForgeryToken]
|
|
public async Task<IActionResult> Logout()
|
|
{
|
|
var props = new AuthenticationProperties
|
|
{
|
|
RedirectUri = Url.Action("Login", "Auth")
|
|
};
|
|
|
|
await HttpContext.SignOutAsync("Cookies");
|
|
await HttpContext.SignOutAsync("oidc", props);
|
|
|
|
return Redirect("/"); // nur als Fallback
|
|
}
|
|
|
|
|
|
[Authorize]
|
|
public IActionResult Info()
|
|
{
|
|
var name = User.Identity?.Name;
|
|
var claims = User.Claims.Select(c => new { c.Type, c.Value }).ToList();
|
|
|
|
ViewBag.Name = name;
|
|
ViewBag.Claims = claims;
|
|
|
|
return View();
|
|
}
|
|
|
|
// Edit-Form anzeigen
|
|
[Authorize]
|
|
[HttpGet]
|
|
public IActionResult Edit()
|
|
{
|
|
var username = User.Identity?.Name;
|
|
var user = _context.Users.FirstOrDefault(u => u.Username == username);
|
|
if (user == null) return NotFound();
|
|
|
|
var model = new EditUserViewModel
|
|
{
|
|
Username = user.Username
|
|
};
|
|
return View(model);
|
|
}
|
|
|
|
// Edit speichern
|
|
[Authorize]
|
|
[HttpPost]
|
|
[ValidateAntiForgeryToken]
|
|
public IActionResult Edit(EditUserViewModel model)
|
|
{
|
|
if (!ModelState.IsValid) return View(model);
|
|
|
|
var username = User.Identity?.Name;
|
|
var user = _context.Users.FirstOrDefault(u => u.Username == username);
|
|
if (user == null) return NotFound();
|
|
|
|
user.Username = model.Username;
|
|
|
|
if (!string.IsNullOrWhiteSpace(model.NewPassword))
|
|
{
|
|
user.Password = BCrypt.Net.BCrypt.HashPassword(model.NewPassword);
|
|
}
|
|
|
|
_context.SaveChanges();
|
|
|
|
// Eventuell hier das Auth-Cookie erneuern, wenn Username sich ändert
|
|
|
|
return RedirectToAction("Index", "Home");
|
|
}
|
|
|
|
// Edit-Form anzeigen
|
|
[Authorize]
|
|
[HttpGet]
|
|
public IActionResult UserSettings()
|
|
{
|
|
var username = User.Identity?.Name;
|
|
var claims = User.Claims.Select(c => new { c.Type, c.Value }).ToList();
|
|
|
|
var user = _context.Users.FirstOrDefault(u => u.Username == username);
|
|
if (user == null) return NotFound();
|
|
|
|
var DbProvider = _context.Database.ProviderName;
|
|
|
|
ViewBag.Name = username;
|
|
ViewBag.Claims = claims;
|
|
ViewBag.IdentityProvider = user.IdentityProvider;
|
|
ViewBag.DbProvider = DbProvider;
|
|
|
|
return View();
|
|
}
|
|
|
|
// Edit speichern
|
|
[Authorize]
|
|
[HttpPost]
|
|
[ValidateAntiForgeryToken]
|
|
public IActionResult UserSettings(EditUserViewModel model)
|
|
{
|
|
if (!ModelState.IsValid) return View(model);
|
|
|
|
var username = User.Identity?.Name;
|
|
var user = _context.Users.FirstOrDefault(u => u.Username == username);
|
|
if (user == null) return NotFound();
|
|
|
|
var databaseProvider = _context.Database.ProviderName;
|
|
|
|
user.Username = model.Username;
|
|
|
|
// Passwort ändern
|
|
if (!string.IsNullOrWhiteSpace(model.NewPassword))
|
|
{
|
|
user.Username = BCrypt.Net.BCrypt.HashPassword(model.NewPassword);
|
|
}
|
|
|
|
_context.SaveChanges();
|
|
|
|
// Eventuell hier das Auth-Cookie erneuern, wenn Username sich ändert
|
|
|
|
return RedirectToAction("Index", "Home");
|
|
}
|
|
}
|