.NET 2.2 Api-ключ аутентификации через промежуточное ПО и сервис валидации - PullRequest
0 голосов
/ 22 февраля 2019

Я работаю над проектом, который включает создание 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>();
    }
}

}

Большое спасибо!

...