我正在从事一个项目,其中包括使用API密钥通过身份验证来制作API。 我创建了Middleware来处理api请求,检查api密钥是否有效,然后创建验证程序服务以限制用户访问不属于所讨论的api密钥的数据。基本上,有一个与API密钥一起存储的CompanyID。
我对此并不陌生,所以请白白接受:) 此代码示例来自中间件,该中间件假定将在其中进行身份验证。在第一个代码示例中,我正在考虑从存储在数据库中的现有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>();
}
}
}
非常感谢!