REST API令牌身份验证

本文关键字:身份验证 令牌 API REST | 更新日期: 2023-09-27 18:03:16

我刚刚开始在。net中开发我的第一个REST API。因为它是无状态的,所以我将使用令牌进行身份验证:

基本思想(System.Security.Cryptography):

  • AES加密+ HMACSHA256完整性
  • 令牌数据将由具有以下属性的对象组成:用户名,签发日期和超时
  • 数据库将保存用户名、散列密码和HMAC散列
登录:

  • 检查凭证是否有效(用户名,将散列密码与db值进行比较)
  • 如果为true,加密数据对象
  • 对生成的令牌使用HMAC并将其存储到数据库
  • 返回令牌(没有HMAC)给用户(cookie/string)

请求需要验证的方法:

  • 用户在每次请求时发送令牌
  • 令牌被解密
  • 如果过期,错误
  • 如果未过期,请使用HMAC并将用户名+生成的散列与数据库值进行比较
  • 如果db检查有效,用户被认证

在我看来,这种方法有以下优点:

  • 即使db被入侵,它也不包含实际的令牌(哈希不能被逆转…)
  • 即使攻击者有令牌,他也不能通过更新字段来增加有效期,因为有效期在令牌本身

首先,我想知道这是不是一个好方法。

除此之外,我还没有弄清楚,在哪里存储AES和SHA256密钥在服务器上(我应该只是硬编码他们吗?如果我把它们做成网。配置或使用机器密钥比我有一个问题的情况下负载均衡的服务器,…)。

最后,我在哪里存储AES IV向量,因为加密。CreateEncryptor需要它解密?这是否意味着用户必须在每次请求时发送令牌+ IV ?

我希望这是有意义的,我提前感谢你的答案。

更新:

好的,现在我做了更多的研究,得出了这个解决方案:

  • 令牌将包含最初指定的数据(用户名,发布日期和超时)
  • 令牌是用encrypt-then-mac生成的(它包括AES加密数据,IV向量+这两个值的标记进行认证,用HMACSHA265生成)
  • 令牌标签将被写入db
  • 用户将被认证,如果:
    • 标签是有效的(令牌认证)
    • 数据可以被解密
    • 令牌尚未过期
    • 标签与数据库
    • 中写入的标签匹配
    • 用户在数据库中没有被阻塞(令牌失效)
  • 密钥将存储在web中。配置单独的部分。相同的密钥必须在每个服务器上(当然是每个应用程序)

我没有使用FormsAuthenticationTicket,因为在。net中有以下问题:

  • 相同的键用于不同的目的(machinekey用于视图状态,资源和formauthticket)
  • .NET使用的mac-then-encrypt不如encrypt-then-mac安全。
  • 没有内置的方法在令牌过期之前使其无效

REST API令牌身份验证

这是该问题下的评论线程的后续内容。

你似乎对OAuth到底是什么有点困惑,所以希望我能在这里澄清一下。

OAuth不是web服务,也不是你消费的东西。它是一种协议,描述了站点可以根据服务对用户进行身份验证的方式,而不允许站点知道用户的凭据是什么。作为附带的好处,大多数OAuth提供者也有一个web服务来查询用户的信息,并且可以同时授予这样做的权限。

通常情况下,您有兴趣从站点的角度实现OAuth(例如,AcmeWidgets.com),以便用户可以通过Facebook或Google或其他东西登录。然而,你也可以实现服务端(例如,Facebook通常会在那里),并允许其他人对你进行身份验证。

因此,例如,假设您有一个web服务,允许第三方站点为用户提供Acme-brand Widgets。您的第一个第三方实现者是流行的MyBook.org。该流看起来像这样:

  1. 有人邀请用户在他们的MyBook配置文件中使用"Acme Widgets"应用程序。
  2. 用户点击按钮,重定向到AcmeWidgets.com。URL看起来像:

    http://acmewidgets.com/oauth/user?r=http%3A%2F%2Fmybook.org%2Foauth%2Fclient&appid=12345

  3. 询问用户是否允许MyBook访问他们的数据和提供小部件。
  4. 用户单击Yes,于是Acme Widgets注意到用户已经允许它。
  5. 用户被重定向回MyBook, URL如下:

    http://mybook.org/oauth/client?token=ABCDEFG

  6. 服务器端的MyBook现在接受该令牌,并将web服务调用BACK放置到AcmeWidgets:

    http://acmewidgets.com/oauth/validate?token=ABCDEFG&appid=12345&appsecret=67890

  7. AcmeWidgets使用标识用户的最终身份验证令牌进行应答。
  8. 或者,它失败,这意味着用户试图伪造令牌,或者他们拒绝许可或其他一些失败条件。
  9. MyBook,使用令牌,现在可以调用AcmeWidgets api:

    http://acmewidgets.com/api/provision?appid=12345&token=ABC123&type=etc

这就是所谓的OAuth舞蹈。请注意,这里有许多实现定义的东西,如url、各种令牌的编码方式、令牌是否可以过期或被撤销等。

希望这能为你澄清一切!