Add password hashing, user settings with 2FA, and project image lightbox.

Hardens auth with PBKDF2, lockouts, local QR setup, and safer embeds while moving account security under the username menu.
This commit is contained in:
Atakan Doğan Özban
2026-07-17 18:49:34 +02:00
parent 8ec6e3fd50
commit e97a71e5b2
18 changed files with 1253 additions and 62 deletions
+10 -21
View File
@@ -1,19 +1,15 @@
@{
@{
Layout = null;
}
<!doctype html>
<html lang="en" data-bs-theme="dark">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Sign-in</title>
<link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.3/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css">
<style>
.form-control {
background-color: #212529 !important;
@@ -30,16 +26,6 @@
box-shadow: 0 0 5px rgba(13, 110, 253, 0.5);
}
.form-check-input {
background-color: #343a40 !important;
border-color: #6c757d !important;
}
.form-check-input:checked {
background-color: #0d6efd !important;
border-color: #0d6efd !important;
}
.btn-primary {
background-color: #0d6efd !important;
border-color: #0d6efd !important;
@@ -51,28 +37,31 @@
}
</style>
</head>
<body class="bg-dark d-flex align-items-center justify-content-center vh-100">
<main class="form-signin w-100" style="max-width: 400px;">
@using (Html.BeginForm("index", "login", FormMethod.Post))
{
@Html.AntiForgeryToken()
<h1 class="h3 mb-3 fw-normal text-white text-center">Please sign in</h1>
if (ViewBag.Error != null)
{
<div class="alert alert-danger py-2">@ViewBag.Error</div>
}
<div class="form-floating">
<input type="text" name="username" class="form-control" id="floatingInput" placeholder="Username">
<input type="text" name="username" class="form-control" id="floatingInput" placeholder="Username" autocomplete="username" required>
<label for="floatingInput">Username</label>
</div>
<div class="form-floating mt-2 mb-2">
<input type="password" name="password" class="form-control" id="floatingPassword" placeholder="Password">
<div class="form-floating mt-2 mb-3">
<input type="password" name="password" class="form-control" id="floatingPassword" placeholder="Password" autocomplete="current-password" required>
<label for="floatingPassword">Password</label>
</div>
<button class="btn btn-primary w-100 py-2" type="submit">Sign in</button>
}
</main>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.3/js/bootstrap.bundle.min.js"></script>
</body>
</html>