设计REST API的身份验证


11

我正在为将要生产和使用的REST服务设计API。我花了几天的时间试图弄清楚如何很好地处理身份验证,并认为我终于想出了一些办法。

我基于有关应用程序堆栈的以下事实提出此建议:

  1. 客户端和服务器位于.NET4中(客户端配置文件中的客户端部分)
  2. 服务器使用WCF REST公开
  3. 我真的不想在应用程序的内存中保留用户名和密码

从3开始,我想使用一种令牌身份验证的方式,以便在服务器验证了凭据之后,客户端将获得令牌以供整个应用程序的其余部分使用(这将使我能够做其他事情,例如使用户超时,并能够在网络版本和桌面版本之间无缝移动用户等)。在弄清楚如何使呼叫重播和防篡改之后,我提出了以下建议:

  1. 在客户端尝试进行身份验证之前,它会使用ECDiffieHellmanCng该类生成Diffie-Hellman密钥对。
  2. 它通过电线发送密钥对的公共部分以及用户名和密码(当然是通过HTTPS)。
  3. 服务器验证用户名/密码组合,如果成功,则执行以下操作:
    1. 创建一个唯一的会话令牌
    2. 生成自己的DH密钥对,并根据客户端提供的公共密钥计算共享密钥
    3. 记录其数据库中的会话令牌,共享机密,用户和“最后操作”时间(用于滚动到期窗口)
    4. 返回会话令牌,其公共DH密钥和身份验证成功消息
  4. 客户端从响应中获取DH密钥,计算共享密钥,并将令牌和密钥存储在内存中。

从那时起,会话令牌/秘密组合的工作方式与大多数其他REST API一样,对请求进行了指纹识别和时间戳记,然后生成了某种HMAC。每当客户端对服务器执行操作时,客户端都会检查令牌/秘密对,并允许该操作有效且未过期,并更新会话中的最后一个操作记录。

我看不到任何明显的缺陷,并且为此可能过度设计了,但是我需要在某个时候学习如何做到这一点。HMAC可以防止重放攻击,DH协商可以防止MITM攻击(我想不到在HMAC / DH之间可以进行有效的攻击)。

任何人都可以在此戳戳?


与仅在各处使用HTTPS和使用普通的旧会话cookie相比,生成DH密钥根本不会增加任何安全性。如果使用得当,HTTPS已经可以抵御中间人攻击和重放攻击。
Lie Ryan

Answers:


5

您应该考虑阅读OpenAM API并借用它,而不是自己发明。

http://forgerock.com/openam.html

OpenAM Wiki特别有用

https://wikis.forgerock.org/confluence/display/openam/Home

您不需要使用它们的组件。但是,如果使用他们的API,从长远来看,您会发现生活会更简单。


嗯,它看起来还不错,在这种情况下,有一件事使我无法使用它:我们是一家.Net商店。此外,将其与WCF服务器端结合使用的东西还很少。我可以在Google上找到一个非垃圾链接,它指向使用WIF和WS-Federation。
Matt Sieker

1
@Matt Sieker:“您不需要使用它们的组件”。请阅读有关其API的信息,而不要发明自己的API。
S.Lott

嗯,我想我明白您的意思了,需求回调的东西。很有意思,我可能会为这个项目或未来的项目进行更多的研究。不必将auth当作一个原子块进行处理,而是将其稍微分解一下,以便服务器可以控制客户端的需求……
Matt Sieker 2011年

我们最初是自己创立的,但是几年前在IG Group迁移到OpenAM。对开源产品非常满意。
罗伯特·莫舍尔

2

我100%同意@ S.Lott,您不想自己动手。我建议查看另一种替代方法:Windows Azure访问控制服务(ACS)。ACS是花钱的,但是它非常便宜(10,000笔交易,合0.01美元),并且可以处理大量基础架构。WIF在客户端上得到利用。

这也是一种基于标准/基于声明的解决方案-真是风靡一时。查看有关同时使用WCF和REST和ACS的文章

如果您正在考虑未来,那么这也是一种可以与您一起成长的机制-因为您在防火墙,合作伙伴等外部拥有移动应用程序。即使您不想使用它,因为它在防火墙之外添加了依赖性,您也可能需要检查一下它的想法。非常光滑

祝好运!-法案

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.