在设计REST API或服务时,是否有处理安全性(身份验证、授权、身份管理)的最佳实践?

在构建SOAPAPI时,您可以将WS-Security作为指南,并且有许多关于该主题的文献。我发现关于保护REST端点的信息较少。

虽然我理解REST故意没有类似于WS-*的规范,但我希望已经出现了最佳实践或推荐的模式。

如有任何讨论或相关文件的链接,我们将不胜感激。如果重要的话,我们将使用WCF和POX/JSON序列化消息,用于使用.NET Framework v3.5构建的REST API/服务。


当前回答

除了HTTP之外,没有其他REST标准。已经建立了REST服务。我建议你看一眼它们,感受一下它们是如何工作的。

例如,在开发自己的服务时,我们借鉴了亚马逊S3 REST服务的许多想法。但我们选择不使用基于请求签名的更高级的安全模型。更简单的方法是通过SSL进行HTTP基本身份验证。你必须决定什么最适合你的情况。

此外,我强烈推荐O'reilly的《RESTful Web Services》一书。它解释了核心概念,并提供了一些最佳实践。您通常可以使用他们提供的模型并将其映射到您自己的应用程序。

其他回答

我有点惊讶的是,还没有提到带有客户端证书的SSL。当然,只有当您能够依靠证书识别用户群体时,这种方法才真正有用。但许多政府/公司确实向其用户发放了这些证书。用户不必担心创建另一个用户名/密码组合,并且在每个连接上都建立了身份,因此与服务器的通信可以完全无状态,不需要用户会话。(并非意味着所提及的任何/所有其他解决方案都需要会议)

正如twitt所说,AmazonS3是一个很好的模型。它们的请求签名确实具有一些特性(如包含时间戳),有助于防止意外和恶意请求重放。

HTTP Basic的优点是几乎所有的HTTP库都支持它。当然,在这种情况下,您需要使用SSL,因为通过网络发送明文密码几乎是一件普遍的坏事。使用SSL时,Basic比Digest更好,因为即使调用方已经知道需要凭据,Digest也需要额外的往返来交换nonce值。使用Basic,调用者只需在第一次发送凭证。

一旦确定了客户机的身份,授权实际上只是一个实现问题。但是,您可以将授权委托给具有现有授权模型的其他组件。同样,Basic的好处是,您的服务器最终提供了客户端密码的明文副本,您可以根据需要将其传递给基础架构中的另一个组件。

除了HTTP之外,没有其他REST标准。已经建立了REST服务。我建议你看一眼它们,感受一下它们是如何工作的。

例如,在开发自己的服务时,我们借鉴了亚马逊S3 REST服务的许多想法。但我们选择不使用基于请求签名的更高级的安全模型。更简单的方法是通过SSL进行HTTP基本身份验证。你必须决定什么最适合你的情况。

此外,我强烈推荐O'reilly的《RESTful Web Services》一书。它解释了核心概念,并提供了一些最佳实践。您通常可以使用他们提供的模型并将其映射到您自己的应用程序。

对于Web应用程序安全,您应该看看OWASP(https://www.owasp.org/index.php/Main_Page)它为各种安全攻击提供了欺骗单。您可以采用尽可能多的措施来保护您的应用程序。关于API安全(授权、身份验证、身份管理),有多种方式(基本、摘要和OAuth)。OAuth1.0中存在循环漏洞,因此可以使用OAuth1.0a(由于对规范的担忧,OAuth2.0没有被广泛采用)

谢谢你的忠告。我们最终使用了一个定制的HTTP头将身份令牌从客户端传递给服务,为将RESTful API和微软即将推出的Zermatt identity框架集成做准备。我已经在这里描述了问题和我们的解决方案。我还采纳了tweet的建议,购买了RESTfulWebServices——如果你正在构建任何类型的RESTfulAPI,这是一本非常好的书。