c# - REST服务认证

标签 c# asp.net-web-api

实现REST api身份验证的最佳实践是什么?

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

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

最佳答案

答案取决于您的Web API的受众以及您要确切进行身份验证的对象。

  • 是否要对使用您的Api的客户端应用程序进行身份验证?
  • 是否要通过应用程序对用户进行身份验证,以在客户端应用程序中(使用Api)检索其数据?
  • 还是要对客户端应用程序和使用客户端应用程序的用户进行身份验证。

  • 根据要验证的内容,您可以有多种选择。但是请始终记住,最好使用一个可靠的解决方案,在该解决方案中可以使用许多客户端库,而不是重塑自己的所有权。永远不要做这些,而是​​以您自己的方式,选择一种身份验证方式,坚持使用它,不要破坏客户端库。

    基本身份验证:易于实现,但是您使用它而不是用户对客户端应用程序进行身份验证。当需要业务信任关系并且认证和安全性不是您的第一要务时,这种认证就很好。但是,无法跟踪您的API中对特定用户(仅是客户端应用程序)的调用。当然,您可以将用户的用户名和密码保存在客户端应用程序中,但这不是一个单一的好习惯。

    基于 token 的身份验证:它们有多种 token 身份验证方式,但是我在这里谈论的是针对用户的单个 token ,用户将其复制到客户端应用程序以访问您的Api。这样,您就可以验证用户(谁在我的Api中进行了此调用?)的身份,并且非常容易使用和使用。退出是这不是最安全的方式,需要用户交互,并且用户可能在超过一个应用程序中使用其Api token 。您可以使用基本身份验证扩展这种身份验证方式,以对客户端进行身份验证。因此,使用clientid + clientsecret + token 来标识用户。但是我认为,如果要完成此任务,最好看看Oauth2。

    OAuth2:如果您希望对身份验证拥有完全访问权限,则可以采用这种方式。这可能是最有前途的方法,但也需要最多的工作(至少在身份提供者/资源提供者方面。客户端应用程序使用大量可用的客户端库可以很容易地实现此功能。通过这种身份验证方式(也基于 token ),您可以对客户端和用户进行身份验证,而无需共享用户名和密码。

    我的建议:如果适合您的情况,将使用基本身份验证,这很容易,并且与HTTPS一起使用是相当安全的。如果不合适,我会选择Oauth2,因为它是最可靠和最常用的标准(Instagram/Google/Facebook),为您提供了很多自由,并且随着ecosystem的增长,它变得越来越容易实现。毕竟,对于实现您的API的人来说,学习有关Oauth 2.0的知识会变得更有趣,然后再了解jgauffin的工作方式。

    引用:我也想邀请您浏览Apigee的网站。 Api是他们的公司,他们有很多有趣的读物。其中之一是一本免费的电子书-Oauth the big picture,其中也有一段有趣的段落,询问您是否真的需要Oauth。 (从第16页开始-是否只需要OAuth就可以保证API安全?)

    For server-to-server APIs - APIs designed to be used only by a small number of servers – OAuth is overkill. Having a separate set of authentication credentials for each app is a nice feature of OAuth, but for server-to-server use, the need to log in securely using a browser, or to implement other steps in the OAuth “dance,” gets in the way. Instead, using a simple security standard like HTTP Basic authentication and assigning a unique password to each app is sufficient. Two-way SSL is another good, albeit cumbersome approach that has the advantage of stronger, more traceable authentication. However, think ahead! Are those APIs really only going to be used by servers forever?



    现有解决方案:不管您采用哪种方式,都会获得最低特权-Dominick Baier和他的nuget软件包可以为您提供一个不错的起点。使用他的Identitymodel实现basic authentication真的很容易。另外,如果您希望准备使用的identityserver为您提供 token ,请查看他的身份服务器,您可以考虑所有事情。但是,如果您决定使用Oauth2,我也应该看看DotnetOpenAuth,因为它(imho)更具可配置性,并且更容易调整为自己的样式,但是它也需要更多的工作。

    关于c# - REST服务认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14996673/

    相关文章:

    c# - LINQ.Aggregate 返回不正确的结果

    ravendb - 返回 IQueryable 但需要 Raven 统计信息才能插入 TotalResults header

    javascript - JSON 数据未保存在 WebAPI 中

    entity-framework - 我们如何通过 Breeze 使用本地时区生存

    c# - 获取滚动位置百分比

    c# - 如何在 C# 中将 rtf 字符串转换为文本

    c# - 单元测试 C# [TestInitialize]

    .net - http://localhost:xxxx/api/values 无法在 .net core 2.2 中加载页面

    c# - 根据某些映射进行子字符串替换

    c# - C++/C# 引用