19

为 REST API 实施身份验证的最佳实践是什么?

使用 BASIC auth + SSL 或类似https://datatracker.ietf.org/doc/html/draft-hammer-http-token-auth-01的东西?

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

4

3 回答 3

35

对此的答案取决于您的 Web API 的受众以及您想要准确验证的内容。

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

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

基本身份验证:很容易实现,但是您使用它来验证客户端应用程序,而不是用户。当需要业务信任关系并且身份验证和安全不是您最关心的问题时,这种身份验证很好。但是没有办法在您的 API 中跟踪对某个用户的调用,而只是一个客户端应用程序。当然,您可以将用户的用户名和密码保存在客户端应用程序中,但这种做法不止一种方式是不好的做法。

基于令牌的身份验证:它们有多种令牌身份验证方式,但我在这里谈论的是用户的单个令牌,用户将其复制到客户端应用程序以访问您的 Api。通过这种方式,您可以验证用户(谁在我的 Api 中进行了此调用?)而且它相当容易制作和使用。撤回是因为它不是最安全的方式,需要用户交互,并且用户可能在多个应用程序中使用他的 Api 令牌。您可以使用基本身份验证扩展这种身份验证方式来对客户端进行身份验证。所以一个clientid + clientsecret + token 来识别用户。但我认为如果你想实现这一点,最好看看 Oauth2。

OAuth2:如果您想完全访问您的身份验证,您可以采用这种方式。这可能是最面向未来的方式,但也需要最多的工作(至少在身份提供者/资源提供者方面。客户端应用程序很容易使用大量可用的客户端库来实现这一点。如果你选择这种身份验证方式(也基于令牌)您可以对客户端和用户进行身份验证,而无需共享您的用户用户名和密码。

我的建议:如果这适合您的情况,将使用基本身份验证,这很容易并且与 HTTPS 一起相当安全。如果它不适合,我会选择 Oauth2,因为它是最可靠和最常用的标准(Instagram / Google / Facebook),给你很多自由,并且随着生态系统的发展变得越来越容易实施。毕竟对于实现你的 API 的人来说,学习一些东西会更有趣Oauth 2.0,然后学习jgauffin做事的方式。

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

对于服务器到服务器的API——设计为仅由少数服务器使用的 API——OAuth 是多余的。为每个应用程序拥有一组单独的身份验证凭据是 OAuth 的一个很好的功能,但是对于服务器到服务器的使用,需要使用浏览器安全登录,或者在 OAuth “舞蹈”中实现其他步骤,进入道路。相反,使用简单的安全标准(如 HTTP Basic 身份验证)并为每个应用程序分配唯一密码就足够了。双向 SSL 是另一种很好的方法,虽然很麻烦,但具有更强、更可追溯的身份验证的优势。但是,请三思而后行!这些 API 真的只会被服务器永远使用吗?

现有解决方案:无论您采用哪种方式,特权最少 - Dominick Baier 和他的 nuget 软件包可以为您提供一个很好的开端。basic authentication使用他的Identitymodel实现非常容易。此外,如果您想要一个现成的身份服务器为您提供令牌,请查看他的身份服务器,它可以满足您的所有想法。但是,如果您决定去,Oauth2我也会看看DotnetOpenAuth,因为它(恕我直言)更具可配置性并且更容易调整到您自己的喜好,但它也需要更多的工作。

于 2013-02-21T13:42:11.353 回答
2

您应该查看Security Token Service或 STS。

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

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

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

于 2013-02-21T07:27:45.633 回答
0

你可以看看这里,IdentityModel 有 Web API 支持:

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

于 2013-02-21T12:35:33.297 回答