我目前正在我的mvc4应用程序中实现web api,并且有一个关于验证web api服务调用者的问题。
在我的网络应用程序中,将使用web api有两个不同的原因。首先,我的javascript与服务器通信,其次是第三方组件与我的应用程序通信。
因此,我想验证服务的调用者。对于任一呼叫者,在标题中传递用户名和密码是直截了当的,但标题可能被非法的嗅探。如果我提供服务https,这将防止这种情况,但它会导致我的js在富应用程序中调用它时出现性能问题。
我已经在网上查看过这方面的示例,但目前还无法找到解决这两种情况并保护我的服务的解决方案。我有兴趣听取有关如何解决这个问题的建议吗?例如,现有公司如何保护他们的服务,即推特。我想保护我的服务,允许第三方和我的javascript。请教育我!
答案 0 :(得分:0)
这样做的一种方法是使用数字签名。客户端计算请求数据的散列(POST或GET参数)并使用密钥对散列进行签名,将签名放在请求头中。然后,服务器验证签名的哈希。
为了防止重放攻击,您希望每个请求都包含一个永远不能重复使用的nonce值。这通常实现为不断增加的整数值(例如时间戳),其中服务器存储给定密钥的最后使用值,并拒绝允许具有低于最后使用值的数字的请求。
有两种常见的方法可以实现这一点,一种方法是使用HMAC签名,其中客户端和服务器共享一个共同的秘密' (键)用于签署请求。这很简单,但要求您将秘密存储在服务器上(并妥善保护它们)。
第二种方法是使用非对称密钥(例如RSA),其中客户端使用其私钥对请求进行签名,并使用其公钥验证签名。这稍微复杂一些,但并不要求您存储和保护服务器上的私钥 - 只有客户端需要具有该私钥。