Я работаю над проектом, который включает создание API с аутентификацией с использованием ключа API.Я создал Middleware для обработки запроса API, чтобы проверить, является ли ключ API действительным, и затем я собираюсь создать службу валидатора, чтобы запретить пользователю доступ к данным, которые не принадлежат данному ключу API.По сути, есть CompanyID, хранящийся вместе с API-ключом.
Я новичок в этом, поэтому, пожалуйста, не обращайте внимания на мою идиотизм :) Этот пример кода взят из промежуточного программного обеспечения, где предполагается, что аутентификация происходит.В этом первом примере кода я думаю, что я получаю существующие api-ключи от того места, где они хранятся в базе данных (то есть CompanyData.ApiKey).Пожалуйста, исправьте меня, если я здесь не прав, потому что я новичок во всем синтаксисе, был бы очень признателен, если бы кто-нибудь указал мне правильное направление.
namespace API.Middleware{
public class APIKeyMessageHandlerMiddleware
{
private readonly ApplicationDbContext _db;
public async Task<ActionResult<CompanyData>> ApiKeyToCheck(string GetCompanyApiKey)
{
CompanyData companyApiKey = await _db.Companydatas.SingleOrDefaultAsync(x => x.ApiKey == GetCompanyApiKey);
return companyApiKey;
}
private RequestDelegate next;
public APIKeyMessageHandlerMiddleware(RequestDelegate next)
{
this.next = next;
}
Далее я хочу сравнить хранимые API-ключис тем, что пользователь вводит в заголовок API "APIKEY".Если ключ, введенный пользователем, существует в базе данных, API должен принять запрос.Вот где я застрял, я не знаю, как это определить.- Продолжение первого примера кода -
public async Task Invoke(HttpContext context)
{
bool validKey = false;
var checkApiKeyExists = context.Request.Headers.ContainsKey("APIKey");
if (checkApiKeyExists)
{
if (context.Request.Headers["APIKey"].Equals(ApiKeyToCheck(How do I get the stored api keys here so I can compare them with what the user enters?)))
{
validKey = true;
}
}
if (!validKey)
{
context.Response.StatusCode = (int)HttpStatusCode.Forbidden;
await context.Response.WriteAsync("permission denied");
}
else
{
await next.Invoke(context);
}
}
}
public static class MyHandlerExtensions
{
public static IApplicationBuilder UseAPIKeyMessageHandlerMiddleware(this IApplicationBuilder builder)
{
return builder.UseMiddleware<APIKeyMessageHandlerMiddleware>();
}
}
}
Большое спасибо!