您可能还想看看 OAuth的 ,一种新兴的基于令牌授权的开放式协议,专门针对http apis。
它与采取的方法非常相似 Flickr的 和 记住牛奶 “休息”apis(不一定是restful apis的好例子,但是基于令牌的方法的好例子)。
除HTTP之外,没有REST标准。那里有成熟的REST服务。我建议你看看他们,并了解他们的工作方式。
例如,我们在开发自己的S3 REST服务时借用了很多想法。但我们选择不使用基于请求签名的更高级安全模型。更简单的方法是基于SSL的HTTP Basic身份验证。你必须决定什么在你的情况下最有效。
另外,我强烈推荐这本书 RESTful Web服务 来自O'reilly。它解释了核心概念并确实提供了一些最佳实践。您通常可以采用他们提供的模型并将其映射到您自己的应用程序。
我搜索了很多关于restful ws安全性的信息,我们最终还是使用了令牌从客户端到服务器来验证请求。我使用spring security来授权服务中的请求,因为我必须根据已经在DB中的指定安全策略对每个请求进行身份验证和授权。
我对客户端证书尚未提及SSL感到惊讶。当然,只有依靠证书识别的用户社区,这种方法才真正有用。但是许多政府/公司确实向用户发布了这些政府/公司。用户不必担心创建另一个用户名/密码组合,并且在每个连接上建立身份,因此与服务器的通信可以完全无状态,不需要用户会话。 (并不意味着所提到的任何/所有其他解决方案都需要会话)
对于Web应用程序安全性,您应该查看OWASP( https://www.owasp.org/index.php/Main_Page )提供各种安全攻击的备忘单。您可以采用尽可能多的措施来保护您的应用程序。 关于API安全性(授权,身份验证,身份管理),已经提到了多种方式(Basic,Digest和OAuth)。 OAuth1.0中存在循环漏洞,因此您可以使用OAuth1.0a(由于担心规范,OAuth2.0未被广泛采用)
我已经使用了OAuth几次,还使用了其他一些方法(BASIC / DIGEST)。我全心全意地建议OAuth。以下链接是我在使用OAuth时看到的最佳教程:
http://hueniverse.com/oauth/guide/
这些答案中的每个人都忽略了真正的访问控制/授权。
例如,如果您的REST API / Web服务是关于POSTing / GETing医疗记录,您可能需要定义访问控制策略,了解谁可以访问数据以及在何种情况下。例如:
为了定义和实现这些细粒度的授权,您需要使用一种名为XACML的基于属性的访问控制语言,即可扩展的访问控制标记语言。
这里的其他标准如下:
XACML与技术无关。它可以应用于Java应用程序,.NET,Python,Ruby ... Web服务,REST API等。
以下是有趣的资源:
OWASP(开放Web应用程序安全项目)有一些备忘单,涵盖了Web应用程序开发的所有方面。该项目是非常有价值和可靠的信息来源。 关于REST服务,您可以检查: https://www.owasp.org/index.php/REST_Security_Cheat_Sheet
感谢您的出色建议。我们最终使用自定义HTTP标头将身份令牌从客户端传递到服务,以准备将我们的RESTful API与即将推出的Microsoft的Zermatt Identity框架集成。我已经描述了这个问题 这里 和我们的解决方案 这里 。我也拿了 tweakt 的建议并买了 RESTful Web服务 - 如果您正在构建任何类型的RESTful API,这本书非常好。
SOAP世界很好地涵盖了安全标准这一事实并不意味着默认情况下它是安全的。首先,标准是 的 非常 强> 复杂。复杂性不是安全性和实施漏洞的非常好的朋友,例如 XML签名包装攻击 在这里流行。
至于.NET环境,我不会帮助太多,但是 使用Java®构建Web服务 (约有10位作者的砖块)对我有所帮助 很多 理解WS- *安全体系结构,特别是它的怪癖。
正如tweakt所说,亚马逊S3是一个很好的模型。他们的请求签名确实具有一些功能(例如合并时间戳),有助于防止意外和恶意请求重放。
HTTP Basic的优点是几乎所有HTTP库都支持它。当然,在这种情况下,您需要使用SSL,因为通过网络发送明文密码几乎是一件坏事。使用SSL时,Basic优于Digest,因为即使调用者已经知道需要凭据,Digest也需要额外的往返来交换nonce值。使用Basic,呼叫者只需在第一次发送凭据。
一旦建立了客户端的身份,授权实际上只是一个实现问题。但是,您可以使用现有授权模型将授权委派给其他组件。关于Basic的优点还在于您的服务器最终会得到客户密码的纯文本副本,您可以根据需要将其简单地传递到基础架构中的另一个组件。
关于安全性与REST相关的最好的帖子之一已经过去了 1 RainDrop 。 MySpace API也使用OAuth来保证安全性,并且您可以完全访问RestChess代码中的自定义通道,我对此进行了大量探索。这是在Mix上演示的,你可以找到帖子 这里 。
我想添加(与stinkeymatt一致),最简单的解决方案是将SSL证书添加到您的站点。换句话说,请确保您的网址是HTTPS://。这将涵盖您的运输安全(砰的一声)。使用RESTful url,想法是保持简单(与WS * security / SAML不同),您可以使用 oAuth2 / openID连接 甚至是Basic Auth(在简单的情况下)。但是你仍然需要SSL / HTTPS。请在此处检查ASP.NET Web API 2安全性: http://www.asp.net/web-api/overview/security (文章和视频)
这已经有一段时间了,但问题仍然存在,尽管答案可能会有所改变。
API网关将是一种灵活且高度可配置的解决方案。 我测试并使用过 KONG 相当多,真的很喜欢我所看到的。 KONG提供了自己的管理REST API,您可以使用它来管理用户。
Express-gateway.io 是最新的,也是一个API网关。
由于@Nathan最终得到了一个简单的HTTP标头,有些人说过OAuth2和客户端SSL证书。它的要点是......你的REST API不应该处理安全性,因为它应该超出API的范围。
相反,应该在其上放置一个安全层,无论它是Web代理后面的HTTP头(一种常见的方法,如SiteMinder,Zermatt甚至是Apache HTTPd),还是像OAuth 2那样复杂。
关键是请求应该在没有任何最终用户交互的情况下工作。所需要的只是确保与REST API的连接经过身份验证。在Java EE中,我们有一个概念 userPrincipal 可以通过获得 HttpServletRequest 。它还在部署描述符中管理,URL模式可以是安全的,因此REST API代码不再需要检查。
userPrincipal
HttpServletRequest
在WCF世界中,我会使用 ServiceSecurityContext.Current 获取当前的安全上下文。您需要将应用程序配置为要求身份验证。
ServiceSecurityContext.Current
我上面的语句有一个例外,那就是使用nonce来防止重放(可能是攻击或只是提交相同数据两次的人)。该部分只能在应用程序层中处理。
我推荐OAuth 2/3。您可以在以下位置找到更多信息 http://oauth.net/2/