我有一个.netcore 2.1 API,它将由Mac的curl脚本调用。
在Mac登录时调用curl脚本。
我想为API添加安全性,以使网络上的每个人都无法访问该API以更新数据库。
我对安全性还是陌生的,因此不确定如何进行此操作。
我一直在阅读有关OWIN / JWT等的内容。
我还阅读了有关JWT的信息,JWT根据数据库中存储的密码注册用户并进行身份验证。
但是我想要对可以访问该数据库的计算机进行身份验证,因为该数据库不会被个人使用,但是会在每台计算机打开时从每台计算机中调用。
这可能吗?如果不是,我应该怎么做?
答案 0 :(得分:0)
这是一种较弱的方法,但是会生成一个Api Key,您可以将其作为标头传递以进行卷曲。没有标题的请求将无法访问。例如传递标题:
curl -H "X-Api-Key: {{key}}" https://foo
然后创建一个用于检查标头的中间件类:
... (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和一些安全的随机材料。在客户端上安装脚本时,请与该标识符一起分发。不确定您打算如何分发脚本,因此在这里我无法对此发表评论。
一旦此信息安装在客户端上,脚本将调用服务器以生成JWT。该令牌应包含到期日期/时间,并且最好使用jti来防止重放攻击。
该博客很好地概述了如何使用JWT https://pioneercode.com/post/authentication-in-an-asp-dot-net-core-api-part-3-json-web-token。
在生成令牌的身份验证方法中,您无需检查密码,而可以检查客户端密钥数据库-我强烈建议您使用良好的安全性准则,而不要存储实际数据,而要加盐和散列服务器上的数据-将这些密钥视为密码!创建令牌时,请确保您设置了到期时间,如果想更进一步,请使用jti来防止重放攻击。
将新令牌返回到脚本,然后使原始API请求传递承载令牌:
curl -H “Authorization: {{token}}” https://foo/api/bar
确保这一切都通过HTTPS完成。
处理此问题的另一种方式(更复杂,但更安全)是使用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参数。
在这种情况下,您仍然需要担心在证书过期之前更换证书。