【问题标题】:Adding Security to .Netcore 2.1 Api为 .Net Core 2.1 Api 添加安全性
【发布时间】:2019-03-24 04:46:46
【问题描述】:

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

在登录 Mac 时调用 curl 脚本。

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

我是安全类的新手,所以不知道如何进行。

我一直在阅读有关 OWIN/JWT 等的信息。

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

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

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

【问题讨论】:

    标签: security .net-core jwt owin


    【解决方案1】:

    API 密钥

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

    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 相互认证

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

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

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

    【讨论】:

    • 您好杰森,谢谢您的回复。在阅读了您的评论并阅读了几篇关于 JWT 的文章后,我决定选择 JWT。如何使用 curl 创建令牌,然后将其传递给下一个 curl 以发布我的值?我是 curl 新手,所以对它不太熟悉。
    • JWT 听起来不错。至于获取令牌,您的第一个 curl 请求将发送给您的身份验证服务。您的第二个要求将是您的常规服务。一种快速的方法是让第一个请求仅使用编码令牌作为“文本/纯文本”而不​​是 JSON 响应进行响应。简短的一行可能是:curl -H 'Authorization: `curl -s https://foo/getmejwt -X POST -d machine secret.json`' -X POST https://bar/yourservice 注意,我没有尝试过这个确切的命令,但想法是反引号调用以获取 JWT 并将其提供给 Authorization 标头。
    • 我试过 JWT 并且成功了。但我们决定不使用它,因为 Mac 通过 curl 调用 api 并且没有用户交互(所以我不得不选择密钥而不是用户名密码的场景)。因此,我们找不到与之合作的理由。但是这个答案适合用户访问api的地方。
    • 很高兴您找到了解决方案!
    猜你喜欢
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 2023-03-14
    • 2018-12-25
    • 2019-08-03
    • 1970-01-01
    相关资源
    最近更新 更多