我有一些服务要向我的端点发送一些消息。但是我需要通过检查http标头是否包含固定的(一定时期)api密钥和ID来验证这些消息。我可以通过检查标题来做到这一点,但我认为这不是好习惯。有人提供有关如何验证消息是否从服务发送的线索吗?
我找到了一些东西,但是它是针对core2.2的,我需要使用2.1 ...(https://github.com/mihirdilip/aspnetcore-authentication-apiKey)
预先感谢
答案 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)
答案 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/