/
softailor
/
gridient
Обзор
Документация
Войти
/
softailor
/
gridient
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
backend/Gridient.Core/Features/AuthConfig/Queries/GetAuthConfigQueryHandler.cs
111 строк
5 KB
Jenkins
Auto add
18 фев 2026, 10:19
18 фев 2026, 10:19
1e6c4f8
Код
Авторство
О чём код?
using Gridient.Core.Features; using Gridient.Core.Features.AuthConfig.Queries; using Gridient.Core.Models.Auth; using Gridient.Core.Options; using MediatR; using Microsoft.Extensions.Options; namespace Gridient.Core.Features.AuthConfig.Queries { /// <summary> /// Обработчик запроса для получения конфигурации аутентификации. /// Переносит бизнес-логику из AuthConfigController в слой MediatR. /// </summary> public class GetAuthConfigQueryHandler : IRequestHandler<GetAuthConfigQuery, AuthConfigModel> { private readonly IReadOnlyList<AuthProviderOptions> _providers; private readonly RegistrationOptions _registrationOptions; private readonly IClientFeatureRegistry _featureRegistry; public GetAuthConfigQueryHandler( IOptions<List<AuthProviderOptions>> providerOptions, IOptions<RegistrationOptions> registrationOptions, IClientFeatureRegistry featureRegistry) { _providers = providerOptions.Value; _registrationOptions = registrationOptions.Value; _featureRegistry = featureRegistry; } public Task<AuthConfigModel> Handle(GetAuthConfigQuery request, CancellationToken cancellationToken) { // Проверяем feature flags для определения доступных типов аутентификации var features = _featureRegistry.GetFeatures(); var hasLocal = features.GetValueOrDefault("auth.local.enabled", false); var hasOidc = features.GetValueOrDefault("auth.oidc.enabled", false); // Фильтруем провайдеры из конфигурации на основе feature flags var enabledProviders = _providers .Where(p => p.IsEnabled) .Where(p => { var isLocal = string.Equals(p.Type, "LocalPassword", StringComparison.OrdinalIgnoreCase); var isOidc = string.Equals(p.Type, "Oidc", StringComparison.OrdinalIgnoreCase); // Показываем провайдер только если соответствующий feature flag включен return (isLocal && hasLocal) || (isOidc && hasOidc); }) .OrderBy(p => p.Order) .ToList(); if (enabledProviders.Count == 0) { throw new InvalidOperationException( "Не настроен ни один провайдер аутентификации или соответствующие feature flags не включены."); } // Определяем режим на основе feature flags var mode = DetermineMode(hasLocal, hasOidc); var providers = enabledProviders .Select(MapToProviderConfig) .ToList(); var result = new AuthConfigModel { Mode = mode, Providers = providers, CanRegister = hasLocal && _registrationOptions.EnablePublicSignup, HasPasswordReset = hasLocal, CurrentUserEndpoint = "/api/Users/GetCurrentUser", LogoutEndpoint = hasOidc ? "/api/auth/oidc/logout" : "/api/Auth/logout" }; return Task.FromResult(result); } private static string DetermineMode(bool hasLocal, bool hasOidc) { return (hasLocal, hasOidc) switch { (true, true) => "Hybrid", (true, false) => "Local", (false, true) => "Oidc", _ => "Unknown" }; } private AuthProviderConfigModel MapToProviderConfig(AuthProviderOptions options) { var isLocal = string.Equals(options.Type, "LocalPassword", StringComparison.OrdinalIgnoreCase); var loginKind = isLocal ? "Password" : "Redirect"; var loginEndpoint = !string.IsNullOrWhiteSpace(options.LoginUrl) ? options.LoginUrl! : isLocal ? "/api/Auth/login" : "/api/auth/oidc/login"; return new AuthProviderConfigModel { Id = options.Id, Type = options.Type, DisplayName = options.DisplayName, LoginKind = loginKind, LoginEndpointOrUrl = loginEndpoint, AllowsRegistration = isLocal && _registrationOptions.EnablePublicSignup }; } } }