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

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

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

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


当前回答

我想添加(与臭马特一致),最简单的解决方案是将SSL证书添加到您的站点。换句话说,确保您的url是HTTPS://。这将保障你的交通安全(一掷千金)。使用RESTfulurl,想法是保持它的简单性(不像WS*security/SAML),您可以使用oAuth2/openID连接,甚至可以使用Basic Auth(在简单的情况下)。但您仍然需要SSL/HTTPS。请在此处检查ASP.NET Web API 2安全性:http://www.asp.net/web-api/overview/security(文章和视频)

其他回答

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

我遇到过的关于REST安全性的最好的帖子之一是1 RainDrop。MySpace API也使用OAuth进行安全保护,您可以完全访问RestChess代码中的自定义频道,我对此进行了大量探索。这是在Mix演示的,你可以在这里找到帖子。

这些答案中的每个人都忽略了真正的访问控制/授权。

例如,如果您的RESTAPI/web服务是关于发布/获取病历的,那么您可能需要定义访问控制策略,以确定谁可以访问数据以及在什么情况下访问数据。例如:

医生可以获取与他们有护理关系的患者的病历任何人都不能在练习时间之外(例如9到5)发布医疗数据最终用户可以获得他们拥有的病历或他们作为监护人的患者的病历护士可以更新与护士属于同一单位的患者的病历。

为了定义和实现这些细粒度授权,您需要使用一种基于属性的访问控制语言XACML,即可扩展访问控制标记语言。

其他标准如下:

OAuth:id。联合和授权委托,例如让一个服务代表我的另一个服务(Facebook可以发布到我的Twitter)SAML:身份联合/web SSO。SAML非常关注用户是谁。WS-Security/WS-*标准:这些标准关注SOAP服务之间的通信。它们特定于应用程序级消息传递格式(SOAP),它们处理消息传递的各个方面,例如可靠性、安全性、机密性、完整性、原子性、事件。。。没有一个涉及访问控制,所有都是特定于SOAP的。

XACML是技术不可知的。它可以应用于java应用程序、.NET、Python、Ruby。。。web服务、REST API等。

以下是有趣的资源:

OASIS XACML网站NIST ABAC标准

我想添加(与臭马特一致),最简单的解决方案是将SSL证书添加到您的站点。换句话说,确保您的url是HTTPS://。这将保障你的交通安全(一掷千金)。使用RESTfulurl,想法是保持它的简单性(不像WS*security/SAML),您可以使用oAuth2/openID连接,甚至可以使用Basic Auth(在简单的情况下)。但您仍然需要SSL/HTTPS。请在此处检查ASP.NET Web API 2安全性:http://www.asp.net/web-api/overview/security(文章和视频)

您可能还想看看OAuth,这是一种新兴的基于令牌的授权开放协议,专门针对http api。

它与flickr所采用的方法非常相似,并记住牛奶“rest”api(不一定是restful api的好例子,而是基于令牌的方法的好例子)。