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

What's the best practice for APIs authentication?

我想为我的 Web API 构建基于令牌的身份验证,以让第 3 方应用程序访问这些 API。

没有用户交互,没有委派,角色和连接的应用程序是从管理门户手动管理的。

根据这些要求,获取 jwt 令牌的最佳做法是什么?

我是否需要像 OpenID 或 OAuth2 这样的协议,或者简单地公开一个采用 APIKey 的端点,如果 APIKey 有效,它将 return 一个安全令牌?

所以,我了解到您的要求是机器对机器的通信。 如果是,最简单的方法是实施“OAuth 2.0 的客户端凭证授予流程”(参考:documentation)。

只有当您的数据不包含高度敏感的数据时,上述方法才适用。

其他选择是使用自己的代码或使用第三方框架实现整个授权服务器,并遵循“OAuth 2.0 的授权代码授予流程”(参考:documentation).

这个选项会很贵,我推荐第一个。

首先,我想解释一下OAuth和OpenID的区别。用户 adrianbanks contrasts the two well in this answer。总而言之,OpenID 是关于身份验证的——证明你是谁。虽然 OAuth 是关于授权的——您是否有权访问功能、数据和您的应用程序。现在,回到你的问题。

无论您是否需要 OAuth,您都应该查看 OWIN (Open Web Interface for .NET) Middleware. We are currently using OWIN to implement our own open API with its OAuth 2.0 Authorization Server 功能。然而,OWIN 并不局限于实现 OAuth 身份验证服务器。一定要看看它是否能满足您的需求。

对于您的情况,可能没有必要实施 OAuth 2.0;但是,这是我推荐的。对于这个问题,这是一个很好的、安全的解决方案。它不仅会解决这个问题,而且在未来,如果你想让用户授权 third-party 集成,OAuth - 更安全的选项 - 已经实现了。

如果您不会让用户使用 third-party 集成,您可以使用 API 键。只要您以 secure 方式实现它,这是一个不错的选择。如果这是您正在寻找的更多内容,请阅读此 post 关于使用 API 密钥安全地验证(和授权)ASP.NET Web [=27] 的 third-party 应用程序=] 项目.

我建议拥有一个单独的身份验证服务器,以便您的管理、身份验证和授权与 Logic/UI 分开保存。

一个好的做法是 https://github.com/IdentityServer/IdentityServer3