【问题标题】:Apikey authentication webapi core 2.1Api Key 认证 web api core 2.1
【发布时间】:2020-01-08 10:20:31
【问题描述】:
【问题讨论】:
标签:
asp.net-core
asp.net-web-api2
【解决方案1】:
如果您有很多端点,甚至可能有多个控制器,我建议您编写一个中间件来处理这个问题。
但是如果这个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
}
【解决方案2】:
您可以检查自定义中间件中的请求标头,如 here 所示。或者您可以使用操作过滤器来检查 api 密钥,请参见代码示例 here。
【解决方案3】:
就像我说的那样,我想通过中间件而不是在 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/