.NET 2.2 Api key authentication genom middleware. Hur jämföra nycklar?
Tja.
jag jobbar på ett projekt som inkluderar att skapa en API med autentisering genom användning av API nycklar. Jag har skapat en middleware som ska hantera API-requesten och som checkar om den angivna API-nyckeln är giltig. Seda kommer jag att skapa en service med en "validator" som ska begräna användaren från att ha åtkomst till data som inte tillhör den angivna API nyckeln i fråga. Det finns alltså ett "CompanyId" lagrat ihop med "APIKey" i tabellen för CompanyData.
Jag är färsk på .NET 2.2 så ha gärna tålamod med mitt idioti Denna kodsnutten är från min middleware, där autentiseringen skall ske. I första kodsnutten tänker jag att jag hämtar existerande API nycklar från där de är lagrade i databasen (det vill säga i CompanyData.ApiKey). Snälla, rätta mig om jag tänker fel här för jag är ny till hela syntaxen och uppskattar verkligen om någon skulle kunna knuffa mig i rätt riktning.
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;
}
Vidare vill jag jämföra de lagrade API nycklarna med vad användaren anger i API headern "APIKEY". Om den angivna nyckeln existerar i databasen skall APIn acceptera förfrågan. Här är det jag har fastnat, jag vet liksom inte hur jag ska definiera det.
--- Fortsättning på kodsnutt #1 --
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(Hur får jag de lagrade nycklarna här så att jag kan jämföra dem med vad användaren anger?)))
{
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>();
}
}
Stort tack!