Невозможно заставить работать настроенные параметры при принудительной аутентификации на основе ключей API.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Гость
 Невозможно заставить работать настроенные параметры при принудительной аутентификации на основе ключей API.

Сообщение Гость »


У меня есть проект веб-API ASP.NET Core 3.1, в котором не предусмотрена безопасность. Теперь мне нужно защитить его с помощью схемы аутентификации на основе ключей API.

Основная идея состоит в том, чтобы позволить клиентам этого веб-API передавать ключ API в заголовке, тогда все ключи клиентского API будут храниться в файле appsettings.json.
>
Подробности реализации:
[*]Настройте собственный ApiKeyAuthenticationOptions, где MyConfigValue будет использоваться для хранения ключей.
общедоступный класс ApiKeyAuthenticationOptions: AuthenticationSchemeOptions { общественная константная строка DefaultScheme = «ApiKey»; схема общедоступной строки => DefaultScheme; общедоступная строка AuthenticationType = DefaultScheme; общественная строка MyConfigValue {get; набор; } } [*]При запуске логика аутентификации добавляется в коллекцию сервисов. public void ConfigurationServices(службы IServiceCollection) { Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddApiKeyAuthentication(Конфигурация); Services.AddControllers(); } [*]Метод расширения AuthenticationBuilder определяется как public static AuthenticationBuilder AddApiKeyAuthentication (этот построитель AuthenticationBuilder, конфигурация IConfiguration) { var config = конфигурация["MyConfigValue"]; builder.Services.Configure(параметры => { options.MyConfigValue = конфигурация; }); builder.AddScheme(ApiKeyAuthenticationOptions.DefaultScheme, options => { }); возвратный строитель; } [*]Обработчик аутентификации определяется как общедоступный класс ApiKeyAuthenticationHandler: AuthenticationHandler { частная константная строка ApiKeyName = «X-Api-Key»; public ApiKeyAuthenticationHandler (параметры IOptionsMonitor, регистратор ILoggerFactory, кодировщик UrlEncoder, часы ISystemClock): база (параметры, регистратор, кодировщик, часы) { } защищенное переопределение асинхронной задачи HandleAuthenticateAsync() { вар myConfigValue = Options.MyConfigValue; если (!Request.Headers.ContainsKey(ApiKeyName)) { return AuthenticateResult.Fail("Отсутствует ключ API"); } вар apiKey = Request.Headers[ApiKeyName]; если (apiKey!= myConfigValue) { return AuthenticateResult.Fail("Неверный ключ API"); } вар претензии = новый [] {новый Claim (ClaimTypes.NameIdentifier, «api-user») }; вар идентичность = новый ClaimsIdentity (требования, Scheme.Name); вар принципал = новый ClaimsPrincipal (идентичность); вар билет = новый AuthenticationTicket (принципал, Scheme.Name); вернуть AuthenticateResult.Success(билет); } } [*]Защитите вызовы API с помощью:

[Authorize(AuthenticationSchemes = "ApiKey")] [*]Я установил MyConfigValue на корневом уровне appsettings.json.
Однако всякий раз, когда функция HandleAuthenticateAsync вызывается вызовами защищенного API, options.MyConfigValue всегда имеет значение null.
Как только я использую ApiKeyAuthenticationOptions по умолчанию без включения MyConfigValue, а затем получаю его внутри ApiKeyAuthenticationHandler, все работает. Но это требует получения MyConfigValue для каждого вызова API, а это неэффективно.
Доступно простое решение в Visual Studio 2022, я могу предоставить его, если спросят. Я также попытаюсь найти способ загрузки на GitHub.

Может кто-нибудь сказать мне, что пошло не так?

Заранее большое спасибо.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»