通过中间件和验证服务进行的.NET 2.2 Api密钥身份验证

时间:2019-02-22 14:23:11

标签: asp.net .net api authentication api-key

我正在从事一个项目,其中包括使用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>();
    }
}

}

非常感谢!

0 个答案:

没有答案