为REST apis实施身份验证的最佳做法是什么?
使用BASIC auth + SSL或类似http://tools.ietf.org/html/draft-hammer-http-token-auth-01的内容?
是否有可用的现有解决方案(适用于.NET / WebApi)?
答案 0 :(得分:34)
答案取决于您的Web API的受众以及您要完全验证的内容。
根据您要验证的内容,您有多种选择。但请记住,最好使用可靠的解决方案,其中有许多客户端库可用,而不是重新发明您自己的库。永远不要做一点,但以自己的方式,选择一种身份验证方式,坚持下去,不要破坏客户端库。
基本身份验证:非常容易实现,但您使用它来验证客户端应用程序,而不是用户。当需要业务信任关系并且认证和安全不是您首先关注的问题时,这种身份验证很好。但是无法将API中的呼叫跟踪回某个用户,只能是客户端应用程序。当然,您可以在客户端应用程序中保存用户的用户名和密码,但这不是一种不好的做法。
基于令牌的身份验证:他们有许多令牌身份验证方式,但我在这里讨论的是用户的单个令牌,用户可以将其复制到客户端应用程序以访问您的API。这样你就可以验证一个用户(谁在我的Api中进行了这个调用?)而且它很容易制作和使用。退出是它不是最安全的方式,需要用户交互,并且用户可能在多个应用程序中使用他的Api令牌。您可以使用基本身份验证扩展此身份验证方式以对客户端进行身份验证。所以一个clientid + clientsecret +令牌来识别用户。但我认为如果你想要实现这一目标,最好先看看Oauth2。
OAuth2 :如果您希望拥有对身份验证的完全访问权限,可以采用这种方式。它可能是最具前瞻性的方法,但也需要最多的工作(至少在身份提供者/资源提供者方面。客户端应用程序很容易实现这一点,有很多可用的客户端库。如果你去这种身份验证方式(也基于令牌)可以对客户端和用户进行身份验证,而无需共享用户的用户名和密码。
我的建议:如果符合您的情况,将使用基本身份验证,这很容易,并且与HTTPS一起使用是相当安全的。如果它不合适,我会选择Oauth2,因为它是最坚实和最常用的标准(Instagram / Google / Facebook),给你带来很多自由和成长ecosystem变得更容易,更容易实现。毕竟,对于实施API的人来说,了解Oauth 2.0
的内容会更有趣,然后了解jgauffin
做事方式。
参考:我还想邀请您浏览Apigee的网站。 Api是他们的事,他们有很多有趣的读物。其中一个是免费的电子书 - Oauth the big picture也有一个有趣的段落,他们会问你是否真的需要Oauth。 (从第16页开始 - 对于API安全性,您只需要OAuth吗?)
对于服务器到服务器的API - 旨在仅由少量服务器使用的API - OAuth太过分了。为每个应用程序提供一组单独的身份验证凭据是一件好事 OAuth的功能,但是对于服务器到服务器的使用,需要使用浏览器安全登录, 或者在OAuth“舞蹈”中实施其他步骤,会妨碍他们。 相反,使用简单的安全标准,如HTTP基本身份验证和分配 每个应用程序的唯一密码就足够了。双向SSL是另一个好处,尽管如此 繁琐的方法,具有更强大,更可追溯的身份验证的优势。 但是,请提前考虑!那些API真的只会被服务器永远使用吗?
现有解决方案:无论你走多远的路还是什么 - Dominick Baier和他的nuget包可以给你一个很好的开端。使用他的Identitymodel实施basic authentication
非常简单。此外,如果您想要一个准备好的identityserver为您提供令牌,请查看他的身份服务器,您可以想到所有这些。但是,如果您决定选择Oauth2
,我也会看一下DotnetOpenAuth,因为它(imho)可以更容易配置,更容易调整到您自己的状态,但它也需要更多工作。
答案 1 :(得分:2)
您应该查看Security Token Service
或STS。
查看这些链接以获取更多信息:
Off-the-shelf Security Token Service (STS) that uses ASP.NET membership provider?
答案 2 :(得分:0)
你可以看一下,IdentityModel有Web API支持:
http://thinktecture.github.com/Thinktecture.IdentityModel.45/