如何开始使用OAuth来保护Web API应用程序?

我有一个Web API应用程序,我知道OAuth将是API的标准安全模型,其中Authentication Server将负责生成授权令牌,以便用户可以发送到我们的服务器并使用服务。

我对此很新,但我理解所涉及的角色:

  • 资源所有者
  • 客户
  • 资源服务器
  • 授权服务器

但OAuth究竟在实践中是什么,而不是理论上的? 它是一个.NET库吗? 这是一家由独立公司提供的服务吗? 这是我可以在我的本地开发机器上配置的东西,看看它是如何工作的?

如何开始使用OAuth来保护Web API应用程序?

OAuth是一个协议; 当前版本是OAuth 2.0 。 更多问题,该链接列出了各种技术中协议的几种实现。 要与.NET Web API一起使用,您可能对DotNetOpenAuth感兴趣,它提供了OAuth 1和OAuth 2的实现。

我正在我正在使用的应用程序中使用DotNetOpenAuth来保护.NET Web API。 我有一个OAuth2Handler ,它扩展了DelegatingHandler ,它在传入的请求到达任何控制器之前插入到Web API管道中。 OAuth2Handler执行以下操作:

  1. 实例化DotNetOpenAuth ResourceServer
  2. 调用ResourceServer.GetPrincipal()来读取和解密访问令牌(由AuthorizationServer在其他地方发出并返回OAuthPrincipal (在我的情况下,我正在读取DotNetOpenAuth实现允许您传递和创建ClaimsPrincipal其他数据。)
  3. 将包含从访问令牌读取的用户信息的IPrincipal分配给线程的User属性和当前HTTP上下文,以便可以从服务控制器中的ApiController.User属性获取它: httpContext.User = Thread.CurrentPrincipal = principal;

老实说,让这一切工作(例如设置授权服务器,资源服务器,证书等)并非易事。 不幸的是,DotNetOpenAuth网站似乎没有一个好的指南。 如果您走这条路线,这里还有一些其他任务:

  • 实现IAuthorizationServer – 这是DotNetOpenAuth提供的接口,允许您插入库并使用其实现来发布OAuth2访问令牌。 您还需要实现INonceStoreICryptoKeyStore ,我使用EntityFramework上下文进行存储。
  • 配置证书AuthorizationServerResourceServer各自使用证书来加密/解密访问令牌,确保它们只能彼此访问。 我构建了一些自定义配置,因此我可以在授权服务器应用程序的web.config文件和我的Web API服务(资源服务器)中管理此配置。
  • 管理刷新令牌 – 首次从授权服务器请求访问令牌时,您将获得OAuth2刷新令牌和访问令牌(取决于您的配置)。 这些服务使用的访问令牌应该是短暂的。 刷新令牌用于获取更多访问令牌。 刷新令牌应该保密(无论你的场景中意味着什么)。 对我来说,这意味着刷新令牌永远不会暴露在我的网络应用程序中的客户端javascript中。

我希望这有助于您深入了解如何开始使用OAuth和.NET Web API。 这是一篇博客文章,演示了其中的一些步骤。 这个SO答案给出了图片客户端的更多高级细节。

(DotNetOpenAuth在线文档现在似乎已经失效了……很遗憾没有链接到它们;显然它之前已经发生过 )。