Harden CSRF/CSP and add hash version upgrades
This commit is contained in:
@@ -262,18 +262,27 @@ internal sealed class AdminWorkflowService(AppDbContext db)
|
||||
if (string.IsNullOrWhiteSpace(password))
|
||||
return ServiceError.BadRequest("Admin password is required.");
|
||||
|
||||
var admin = await db.Players.AsNoTracking().FirstOrDefaultAsync(p => p.Id == adminPlayerId && p.IsAdmin);
|
||||
var admin = await db.Players.FirstOrDefaultAsync(p => p.Id == adminPlayerId && p.IsAdmin);
|
||||
if (admin is null)
|
||||
return ServiceError.Unauthorized();
|
||||
|
||||
var monitor = ctx.RequestServices.GetRequiredService<AuthAttemptMonitor>();
|
||||
var verified = PasswordHasher.Verify(password, admin.PasswordHash, admin.PasswordSalt);
|
||||
var verified = PasswordHasher.Verify(password, admin.PasswordHash, admin.PasswordSalt, admin.PasswordHashVersion, out var needsRehash);
|
||||
if (!verified)
|
||||
{
|
||||
monitor.RecordFailure(ctx, "admin-password", admin.NormalizedUsername, "invalid-password");
|
||||
return ServiceError.BadRequest("Invalid admin password.");
|
||||
}
|
||||
|
||||
if (needsRehash)
|
||||
{
|
||||
var (upgradedHash, upgradedSalt) = PasswordHasher.HashPassword(password);
|
||||
admin.PasswordHash = upgradedHash;
|
||||
admin.PasswordSalt = upgradedSalt;
|
||||
admin.PasswordHashVersion = PasswordHasher.CurrentVersion;
|
||||
await db.SaveChangesAsync();
|
||||
}
|
||||
|
||||
monitor.RecordSuccess(ctx, "admin-password", admin.NormalizedUsername);
|
||||
return null;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user