diff --git a/PARR.API/Authentication/ParrAuthenticationHandler.cs b/PARR.API/Authentication/ParrAuthenticationHandler.cs index bdd960f2..078db9e3 100644 --- a/PARR.API/Authentication/ParrAuthenticationHandler.cs +++ b/PARR.API/Authentication/ParrAuthenticationHandler.cs @@ -27,6 +27,7 @@ namespace PARR.API.Authentication if (ipClient == null) return AuthenticateResult.Fail($"IP address not defined. IP: {ipClient}"); + // Аутентификация - просто проверка, есть ли у нас такой пользователь using (var scope = serviceProvider.CreateScope()) { @@ -36,7 +37,17 @@ namespace PARR.API.Authentication if (userIsBlocked) return AuthenticateResult.Fail($"IP address is on the blocking list. IP: {ipClient}"); + // если зашли с IP 127.0.0.1, то это скорей всего опрос состояния контейнера + // если этот пользователь не заведен в БД, то разрешаем ему вход, но роли не даем (он получит доступ как аноним) + // если он есть в БД, то применятся правила из БД + var user = await authService.GetUserAsync(ipClient); + if (user == null && ipClient == "127.0.0.1") + { + // это опрос состояния контейнера, возвращаем что ок, без ролей + return CreateLocalAuth(ipClient); + } + if (user == null) return AuthenticateResult.Fail($"IP address not defined. IP: {ipClient}"); @@ -56,5 +67,22 @@ namespace PARR.API.Authentication return AuthenticateResult.Success(new AuthenticationTicket(claimsPrincipal, Scheme.Name)); } } + + + private AuthenticateResult CreateLocalAuth(string ipClient) + { + // Когда контейнер запрашивает health статус, + + var claims = new List { + new Claim(ClaimTypes.Name, ipClient) + }; + + var claimsIdentity = new ClaimsIdentity(claims, Scheme.Name); + var claimsPrincipal = new ClaimsPrincipal(claimsIdentity); + + return AuthenticateResult.Success(new AuthenticationTicket(claimsPrincipal, Scheme.Name)); + } + + } }