2.3 KiB
Спецификация 01: аутентификация владельца (AdminAuthService)
Источники: Ф-9 (🛡 только владелец), tech-req 4.2 (PBKDF2 100k,
префикс pbkdf2$), module_reqs разд. 2.
1. Формат хэша
Admin.PasswordHash = pbkdf2$100000$<salt_b64>$<hash_b64>:
PBKDF2-HMAC-SHA256, 100 000 итераций, соль 16 байт, вывод 32 байта,
salt/hash — base64. Генерация (владельцу; python):
python -c "import os,hashlib,base64;s=os.urandom(16);print('pbkdf2$100000$'+base64.b64encode(s).decode()+'$'+base64.b64encode(hashlib.pbkdf2_hmac('sha256',b'ПАРОЛЬ',s,100000)).decode())"
AdminAuthService.HashPassword(password, salt?) — тот же формат
(используется тестами).
2. Сессии
Login(login, password): сверка сAdmin.Login(константное сравнение) иAdmin.PasswordHash→ валидно → токенBase64Url(32 random bytes), словарьtoken → expiresAt = UtcNow+8ч; невалидно →null(эндпоинт отдаёт 401, без деталей);Validate(token)→ bool (просроченные удаляются лениво);Logout(token)— удаление;- перезапуск сервера — словарь пуст (вход заново);
Admin.Loginпуст в конфиге → консоль отключена: login всегда 401 (serve-валидацию не ломает — ключи опциональны);- 🛡2: токен/пароль/хэш не логируются и не возвращаются.
3. Эндпоинт и фильтр
POST /api/admin/login body {"login":"...","password":"..."} →
200 {"token":"..."} | 401 {"error":"unauthorized"}. Rate: без
ограничений в v1 (консоль за reverse-proxy, вопрос развёртывания).
AdminAuthFilter (MVC-фильтр на контроллерах admin): заголовок
Authorization: Bearer <token>; нет/невалиден/просрочен → 401
{"error":"unauthorized"}. Контур /api/admin/* не проходит
ApiKeyMiddleware (🛡1 — атлетские X-Api-Key там не действуют).