REST服务身份validation

为REST apis实施身份validation的最佳实践是什么?

使用BASIC auth + SSL或类似http://tools.ietf.org/html/draft-hammer-http-token-auth-01 ?

是否有可用的现有解决方案(适用于.NET / WebApi)?

答案取决于您的Web API的受众以及您要完全validation的内容。

  • 您要validation使用Api的客户端应用程序吗?
  • 您是否要从应用程序中validation用户以在客户端应用程序中检索其数据(使用您的Api)?
  • 或者您是否要使用客户端应用程序对客户端应用程序和用户进行身份validation。

根据您要validation的内容,您有多种选择。 但请记住,最好使用可靠的解决方案,其中有许多客户端库可用,而不是重新发明您自己的库。 永远不要做一点,但以自己的方式,选择一种身份validation方式,坚持下去,不要破坏客户端库。

基本身份validation:非常容易实现,但您使用它来validation客户端应用程序,而不是用户。 当需要业务信任关系并且认证和安全不是您首先关注的问题时,这种身份validation很好。 但是无法将API中的呼叫跟踪回特定用户,只能跟踪客户端应用程序。 当然,您可以在客户端应用程序中保存用户的用户名和密码,但这是一种不好的做法。

基于令牌的身份validation:它们有许多令牌身份validation方式,但我在这里讨论的是用户的单个令牌,用户可以将其复制到客户端应用程序以访问您的Api。 这样你就可以validation一个用户(谁在我的Api中进行了这个调用?)并且它很容易制作和使用。 退出是它不是最安全的方式,需要用户交互,并且用户可能在多个应用程序中使用他的Api令牌。 您可以使用基本身份validation扩展此身份validation方式以对客户端进行身份validation。 所以一个clientid + clientsecret +令牌来识别用户。 但我认为如果你想要实现这一目标,最好先看看Oauth2。

OAuth2:如果您希望拥有对身份validation的完全访问权限,则可以采用这种方式。 它可能是最具前瞻性的方法,但也需要最多的工作(至少在身份提供者/资源提供者方面。客户端应用程序很容易实现这一点,有很多可用的客户端库。如果你去这种身份validation方式(也基于令牌)可以对客户端和用户进行身份validation,而无需共享用户的用户名和密码。

我的建议:如果符合您的情况,将使用基本身份validation,这很容易,与HTTPS一起使用是相当安全的。 如果它不适合我会选择Oauth2,因为它是最坚实和最常用的标准( Instagram / Google / Facebook ),为您提供了很多自由,并且不断增长的生态系统变得更容易,更容易实现。 毕竟对于实现你的API的人来说,了解一下有关Oauth 2.0内容会更有趣,然后了解jgauffin的做事方式。

参考:我还想邀请您看看Apigee的网站。 Api是他们的事,他们有很多有趣的读物。 其中一个是免费电子书 – Oauth的大图片也有一个有趣的段落,他们问你是否真的需要Oauth。 (从第16页开始 – 对于API安全性,您需要OAuth吗?)

对于服务器到服务器API – 设计为仅由少量服务器使用的API – OAuth是过度的。 为每个应用程序提供一组单独的身份validation凭据是OAuth的一个很好的function,但是对于服务器到服务器的使用,需要使用浏览器安全登录,或者实现OAuth“舞蹈”中的其他步骤,方式。 相反,使用简单的安全标准(如HTTP Basic身份validation)并为每个应用程序分配唯一的密码就足够了。 双向SSL是另一种好的,尽管是繁琐的方法,具有更强大,更可追踪的身份validation的优势。 但是,请提前考虑! 那些API真的只会被服务器永远使用吗?

现有的解决方案:无论你走到哪里都是最不利的 – Dominick Baier和他的nuget包可以给你一个很好的开端。 使用他的Identitymodel实现basic authentication非常简单。 此外,如果您想要一个随时可用的身份服务器为您提供令牌,请查看他的身份服务器,您可以想到这一切。 但是如果你决定选择Oauth2我也会看看DotnetOpenAuth,因为它(imho)可以更容易配置,更容易调整到你自己的类似,但它也需要更多的工作。

您应该查看Security Token Service或STS。

查看这些链接以获取更多信息:

使用ASP.NET成员资格提供程序的现成安全令牌服务(STS)?

http://msdn.microsoft.com/en-us/library/ee517259.aspx

您可以在这看一下,IdentityModel具有Web API支持:

http://thinktecture.github.com/Thinktecture.IdentityModel.45/