【问题标题】:Securing an API with a Token使用令牌保护 API
【发布时间】:2015-10-25 19:06:49
【问题描述】:

我目前正在开发 API,但我对如何保护它有点困惑。我不想重新发明轮子,而且我不是密码学专家。

我目前的计划如下;

  • 检查客户端是否通过 HTTPS 进行通信

  • 检查客户端是否有令牌,如果有则验证它,否则让他们登录(返回 401)

为了验证令牌,我会检查它是否存在于数据库中,如果它确实检查它没有过期。

如果令牌不存在,我会要求他们进行身份验证。这将涉及通过 HTTPS 将他们的用户名和密码发送到服务器,我将使用传统方法(散列、加盐、比较等)对其进行检查。如果一切顺利,那么我将创建一个会话密钥/令牌/random 字符串,并在以后的所有请求中要求他们将其与 API 请求一起发送。

这听起来是不是一种明智的做法?

谢谢

【问题讨论】:

  • 听起来不错。如果您颁发数字签名令牌,则无需进行数据库查找。
  • 听起来您确实在尝试重新发明轮子,并且对于这个主题可能很危险 - 取决于您可以使用已建立的 ASP.NET 版本(例如 OWIN)来发布和根据您的方案验证令牌。您在谈论授权 (OAuth),同时也在谈论正确的密码存储。例如参见:link。有大量关于在 ASP.NET 中使用令牌和正确密码存储的文章。

标签: api security asp.net-web-api cryptography token


【解决方案1】:

您可以选择使用单点登录并将令牌生成委托给安全令牌服务,例如Thinktecture's Identity Server。 然后在 API 端,您只需配置 Bearer 令牌身份验证,如下所示:

app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
    {
        Authority = "https://localhost:44319/identity",
        RequiredScopes = new[] { "sampleApi" }
    });

此处的完整示例:https://identityserver.github.io/Documentation/docs/overview/mvcGettingStarted.html。

【讨论】:

    【解决方案2】:

    对于初学者来说,这听起来不错。您正在考虑的是基本身份验证,然后是基于令牌的授权。但是您还应该考虑使用某种混淆技术来发送用户名和密码。与 base64 一样,它采用特定格式,只有您的算法才能在服务器端解密。这是一个可以帮助你的好教程:http://www.codeproject.com/Articles/1005485/RESTful-Day-sharp-Security-in-Web-APIs-Basic

    【讨论】:

    • 您应该仅结合 HTTPS 使用基本身份验证,因此无需混淆。此外,base64 是一种编码,而不是加密。
    • @MvdD 我建议作为一种额外的措施,我匆忙使用术语“解密”而不是“解码”。除此之外,我没有提出任何可怕的建议。
    猜你喜欢
    • 2019-08-29
    • 2013-03-27
    • 2014-06-30
    • 2020-06-20
    • 1970-01-01
    • 2017-04-20
    • 2018-12-26
    • 2019-09-20
    • 1970-01-01
    相关资源
    最近更新 更多