feat(control): add testing password login for web console #61
No reviewers
Labels
No labels
bug
documentation
duplicate
enhancement
good first issue
help wanted
invalid
question
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: ochenstarik/server-monitor-manager#61
Loading…
Reference in a new issue
No description provided.
Delete branch "antigravity/password-login"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Antigravity: вход в консоль по логину и паролю для тестов — Этап 3
Реализован механизм входа в консоль по логину и паролю для тестовых сред в соответствии с
smm-antigravity-task-password-login-2026-08-18.md.База
main@25bfa8dantigravity/password-loginЧто сделано
Конфигурация и отключение по умолчанию:
Authentication:PasswordLogin(PasswordLoginOptions):EnabledForTesting(по умолчаниюfalse);Username(имя пользователя для входа);PasswordHash(подбор-стойкий хеш пароля);SessionTtlMinutes(время жизни сессии, по умолчанию 60 мин).false), эндпоинт/api/v1/auth/loginвозвращает404 Not Found, а консоль и API остаются строго закрыты требованием mTLS-сертификата ролиOperator.Предупреждение в логе при каждом старте:
EnabledForTesting=trueв лог выводится обязательное предупреждение уровняWarning:SECURITY WARNING: Password login is enabled for testing purposes (Authentication:PasswordLogin:EnabledForTesting=true). Do not enable in production environments!.Подбор-стойкое хеширование и защита от атак по времени (Timing Attacks):
PasswordHasherна базеRfc2898DeriveBytes.Pbkdf2с 600,000 итераций SHA-256, 16-байтным криптографически стойким salt и сравнением в константном времени (CryptographicOperations.FixedTimeEquals).PerformDummyVerification) и искусственная задержка (500 мс), гарантирующие одинаковое время ответа сервера независимо от существования пользователя.Ограничение частоты попыток (Rate Limiting):
/api/v1/auth/loginназначена политика ограничения частоты"password-login"(лимит 5 запросов в минуту на IP). При превышении возвращается429 Too Many Requests.Ограниченная по времени сессия и эндпоинты аутентификации:
PasswordSessionServiceгенерирует криптографически стойкий 32-байтный сессионный токен с ограниченным сроком действия (SessionTtlMinutes).POST /api/v1/auth/loginвозвращает токен и устанавливаетHttpOnly,SameSite=Strict,Securecookiesmm_session.POST /api/v1/auth/logoutотзывает токен и очищает cookie.GET /api/v1/auth/statusвозвращает статусenabledForTesting.Ограничение роли (только Operator) и сохранение строгого приоритета mTLS:
Operator. Попытки доступа к маршрутамAutomation(/api/v1/automation/**) илиAgent(/api/v1/agents/**) отклоняются с кодом403 Forbidden.Combinedналичие клиентского сертификата имеет безусловный приоритет перед токеном/cookie.Веб-интерфейс консоли:
Отчёт о тестировании
1. Локальные тесты (PASS)
dotnet build— 0 ошибок.dotnet test— 157 пройденных тестов (включая 7 новых интеграционных проверок вPasswordLoginTests.cs):WhenPasswordLoginIsDisabledEndpointsReturnDisabledStatusAndRejectLogin— приEnabledForTesting=falseэндпоинт входа отвечает 404, а доступ к Control без сертификата отклонён (401);WhenPasswordLoginIsEnabledSuccessfulLoginGrantsOperatorRoleOnly— успешный вход выпускает токен и cookie, открывает доступ кGET /api/v1/control/agents,GET /api/v1/control/linksиPOST /api/v1/control/agents/{id}/enrollment-code;PasswordSessionTokenCannotAccessAutomationRoutes— токен оператора отклоняется с403 Forbiddenна маршрутах/api/v1/automation/linksи/api/v1/agents/provisioning/jobs/next;WrongPasswordAndUnknownUserBothFailWithUnauthorizedAndUniformExecution— неверный пароль и неизвестный пользователь одинаково возвращают 401;ExceedingRateLimitRejectsWithTooManyRequests— превышение 5 попыток входа в минуту возвращает429 Too Many Requests;ClientCertificateAuthenticationHasPriorityAndWorksUnderBothModes— аутентификация по клиентскому сертификату mTLS работает и имеет приоритет как при включенном, так и при выключенном флаге парольного входа;LogoutRevokesSessionToken— вызов/api/v1/auth/logoutнемедленно отзывает сессионный токен, повторные запросы отклоняются с 401.2. CI Workflows (PASS, все зелёные)
build-and-test: https://github.com/ochenstarik-ui/server-monitor-manager/actions/runs/32063357096/job/95489511205 — PASS (6m 46s)build: https://github.com/ochenstarik-ui/server-monitor-manager/actions/runs/32063357105/job/95489510886 — PASS (3m 43s)3. Границы изменений
git diff --name-only origin/main:src/ServerMonitorManager.Control/PasswordHasher.cssrc/ServerMonitorManager.Control/PasswordLoginOptions.cssrc/ServerMonitorManager.Control/PasswordSessionAuthenticationHandler.cssrc/ServerMonitorManager.Control/PasswordSessionService.cssrc/ServerMonitorManager.Control/Program.cssrc/ServerMonitorManager.Control/wwwroot/app.jssrc/ServerMonitorManager.Control/wwwroot/index.htmlsrc/ServerMonitorManager.Control/wwwroot/style.csssrc/ServerMonitorManager.Core/PasswordLoginModels.cssrc/ServerMonitorManager.Core/SmmJsonContext.cstests/ServerMonitorManager.Control.Tests/PasswordLoginTests.csdeploy/**, релизные workflow и защищённые каталоги не затрагивались.