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安全。
- 没有内置的方法在令牌过期之前使其无效
这是该问题下的评论线程的后续内容。
你似乎对OAuth到底是什么有点困惑,所以希望我能在这里澄清一下。
OAuth不是web服务,也不是你消费的东西。它是一种协议,描述了站点可以根据服务对用户进行身份验证的方式,而不允许站点知道用户的凭据是什么。作为附带的好处,大多数OAuth提供者也有一个web服务来查询用户的信息,并且可以同时授予这样做的权限。
通常情况下,您有兴趣从站点的角度实现OAuth(例如,AcmeWidgets.com),以便用户可以通过Facebook或Google或其他东西登录。然而,你也可以实现服务端(例如,Facebook通常会在那里),并允许其他人对你进行身份验证。
因此,例如,假设您有一个web服务,允许第三方站点为用户提供Acme-brand Widgets。您的第一个第三方实现者是流行的MyBook.org。该流看起来像这样:
- 有人邀请用户在他们的MyBook配置文件中使用"Acme Widgets"应用程序。
-
用户点击按钮,重定向到AcmeWidgets.com。URL看起来像:
http://acmewidgets.com/oauth/user?r=http%3A%2F%2Fmybook.org%2Foauth%2Fclient&appid=12345
- 询问用户是否允许MyBook访问他们的数据和提供小部件。
- 用户单击Yes,于是Acme Widgets注意到用户已经允许它。
-
用户被重定向回MyBook, URL如下:
http://mybook.org/oauth/client?token=ABCDEFG
-
服务器端的MyBook现在接受该令牌,并将web服务调用BACK放置到AcmeWidgets:
http://acmewidgets.com/oauth/validate?token=ABCDEFG&appid=12345&appsecret=67890
- AcmeWidgets使用标识用户的最终身份验证令牌进行应答。
- 或者,它失败,这意味着用户试图伪造令牌,或者他们拒绝许可或其他一些失败条件。
-
MyBook,使用令牌,现在可以调用AcmeWidgets api:
http://acmewidgets.com/api/provision?appid=12345&token=ABC123&type=etc
这就是所谓的OAuth舞蹈。请注意,这里有许多实现定义的东西,如url、各种令牌的编码方式、令牌是否可以过期或被撤销等。
希望这能为你澄清一切!