为 .Net Core 2.1 添加安全性 Api

Adding Security to .Netcore 2.1 Api

我有一个 .netcore 2.1 API,它将被 Mac 的 curl 脚本调用。

在 Mac 登录时调用 curl 脚本。

我想给 API 添加安全性,这样网络上的每个人都无法访问 API 来更新数据库。

我对安全这类事情不熟悉,所以不确定如何进行。

我一直在阅读 OWIN/JWT 等

我还阅读了 JWT,它注册用户并根据存储在数据库中的密码进行身份验证。

但我想要的是对可以访问数据库的计算机进行身份验证,因为它不会被个人使用,但会在打开时从每台计算机调用。

这可能吗?如果不是,我的方法应该是什么?

Api键

这是一种较弱的方法,但会生成一个 Api 密钥,您可以将其作为 header 传递给 curl。没有 header 的请求无法访问。例如通过 header:

curl -H "X-Api-Key: {{key}}" https://foo

然后创建一个中间件 class 检查 header:

... (pseudo code for middleware) ...
if (Request.Headers["X-Api-Key"] == {{key}}) {
  return next();  // key is good keep going
} else {
  return;  // key isn't valid.
}
...

智威汤逊

让服务器为每个客户端生成一个唯一标识符。的标识符应该是不容易猜到的东西,例如一个唯一的 ID 加上一些安全的随机数 material。当您在客户端上安装脚本时,将此标识符与其一起分发。不确定你打算如何分发脚本,所以我不能在这里发表评论。

在客户端安装此信息后,脚本将调用服务器以生成 JWT。令牌应包括过期时间 date/time 并且最好使用 jti 来防止重放攻击。

此博客很好地概述了使用 JWT,https://pioneercode.com/post/authentication-in-an-asp-dot-net-core-api-part-3-json-web-token

在生成令牌的身份验证方法中,不是检查密码,而是检查客户端密钥数据库——我强烈建议使用良好的安全规则,不要存储实际数据,而是用盐腌和服务器上的散列数据——把这些密钥当作密码!!当你创建令牌时,确保你设置了一个过期时间,如果你想更进一步,使用 jti 来防止重放攻击。

Return 新令牌到您的脚本,然后使您的原始 API 请求传递不记名令牌:

curl -H “Authorization: {{token}}” https://foo/api/bar

确保这一切都通过 HTTPS 完成。

SSL/TLS 相互认证

另一种处理此问题的方法(更复杂,但更安全)是使用 SSL/TLS 相互身​​份验证。我没有尝试使用 .NET Core 进行设置,但您可以使用 Nginx 作为 .NET 进程的前端,它可以配置为相互验证。看看 https://blog.codeship.com/how-to-set-up-mutual-tls-authentication/.

在这种方法中,您将创建自己的根 CA,为每个客户端生成一个证书,并找出在客户端上安装证书的方法。确保将客户端证书文件的权限设置为用户只读 (chmod 400 client-cert.pem),然后使用 --cert/--key 参数。

在这种情况下,您仍然需要担心在证书到期之前更换证书。