apikey身份验证webapi核心2.1

时间:2020-01-08 10:20:31

标签: asp.net-core asp.net-web-api2

我有一些服务要向我的端点发送一些消息。但是我需要通过检查http标头是否包含固定的(一定时期)api密钥和ID来验证这些消息。我可以通过检查标题来做到这一点,但我认为这不是好习惯。有人提供有关如何验证消息是否从服务发送的线索吗?

我找到了一些东西,但是它是针对core2.2的,我需要使用2.1 ...(https://github.com/mihirdilip/aspnetcore-authentication-apiKey

预先感谢

3 个答案:

答案 0 :(得分:0)

如果您有很多端点,甚至可能有多个控制器,我建议编写一个中间件来处理。

但是,如果仅对一个端点需要此apikey检查。因为你说“我的终点”。 我建议只检查控制器动作/端点中的标头值

示例:

[HttpGet]
public async Task<IActionResult> ExampleEndpoint() {
   var headerValue = Request.Headers["Apikey"];
   if(headerValue.Any() == false)
    return BadRequest(); //401

   //your endpoint code
   return Ok(); //200
}

答案 1 :(得分:0)

您可以在定制中间件中检查请求标头,如here所示。或者,您可以使用动作过滤器来检查api密钥,请参见代码示例here

答案 2 :(得分:0)

就像我说过的那样,我想通过中间件而不是在http管道的末尾执行此操作。在此期间,我想出了一个解决方案,它很简单,但是有效。

我使用以下异步方法创建了一个名为MiddelWareKeyValidation的类:

public async Task Invoke(HttpContext context)
        {
            if (!context.Request.Headers.Keys.Contains("X-GCS-Signature") || !context.Request.Headers.Keys.Contains("X-GCS-KeyId"))
            {
                context.Response.StatusCode = 400;      
                await context.Response.WriteAsync("User Key is missing");
                return;
            }
            else
            {
                var apiKey = new ApiKey { Signature = context.Request.Headers["X-GCS-Signature"], Key = context.Request.Headers["X-GCS-KeyId"] };

                if (!ContactsRepo.CheckValidUserKey(apiKey))
                {
                    context.Response.StatusCode = 401;
                    await context.Response.WriteAsync("Invalid User Key");
                    return;
                }
            }

            await _next.Invoke(context);
        }

然后,我在Configure方法中转到Startup.cs,在其中添加新的中间件,如下所示:

app.UseMiddleware<MiddelWareKeyValidation>();

这篇文章提供了很好的资源和信誉:https://www.mithunvp.com/write-custom-asp-net-core-middleware-web-api/