如何安全使用OAuth 2.0的多个资源服务器?

问题描述:

考虑使用OAuth 2.0进行授权和OpenID 2.0进行身份验证的以下分布式系统。如何安全使用OAuth 2.0的多个资源服务器?

enter image description here

  1. RS1,RS2和RS3是 “资源服务器”(又名三种不同的REST API)
  2. APP1和APP2是客户
  3. AS是一个“授权服务器“用于管理OAuth令牌
  4. OPENID是一个OpenID 2.0提供程序。

APP2使用RS1,RS1又使用RS2和RS3上的资源。 RS1,RS2,RS3,APP2,AS和OPENID之间存在信任关系,因为它们是由同一家公司(但不同的团队)开发的。当用户第一次访问APP2时,APP2被自动授权以代表用户访问RS1,RS2和RS3上的资源。

APP1使用RS2中的资源,而RS2又使用RS3中的资源。 APP1是不受信任的第三方网站,用户需要明确授权APP1访问RS2和RS3上的资源。

有关OAuth 2.0的大多数示例都显示了单个资源和授权服务器之间的通信以及如何请求,发放和管理令牌。

如何使用OAuth 2.0保护此环境?例如,APP2,RS1和RS2是否有自己的客户端标识符和客户端密钥(因为它们都是另一台服务器的“客户端”)?如果是这样,当RS1尝试在另一个请求(来自APP2)的第一次尝试访问RS2和RS3上的资源时,如何为RS1发出令牌?

我已经有AS,OPENID,APP2和RS1,它是使用ASP.NET MVC 3,WCF 4和DotNetOpenAuth 4开发的。我试图将RS2,RS3和APP1引入系统,但很难弄清楚资源服务器和客户端之间的授权如何工作。一切都在IIS 7.5和HTTPS下运行。

我认为APP2是一个网络应用程序,因为任何其他类型的应用程序一旦下载到客户端机器就不能被“信任”。

我认为,只要使用客户端凭据对您的可信应用程序进行身份验证,您就是对的。 DotNetOpenAuth 4.0测试版尚不支持客户端凭证,但希望在下周左右发布。

在OAuth 2中,客户端凭证将内置到您的可信客户端中。这些凭证将在运行时进行交换,以刷新和访问令牌,并将其发送到资源服务器。您可以使用DNOA API将访问令牌应用于每个出站HTTP请求,该DNOA API将通过对授权服务器的另一请求自动续订任何过期的访问令牌。

+0

是的,APP2是一个用ASP.NET MVC 3编写的web应用程序。 – bloudraak 2012-02-23 19:40:47

+0

假设“bob”访问APP2,它在访问RS1时具有访问令牌(表示“bob”)。如何将RS1到RS2的请求识别为代表“bob”而不是其他人的请求。唯一想到的解决方案是RS1为每个用户提供唯一的客户端凭证,并查找这些客户端凭证并在从RS2请求资源时使用它。这在凭证管理方面提出了一些挑战。 – bloudraak 2012-02-23 20:04:58

+0

既然你说RS *是可信的,他们不需要每个用户的访问令牌。只是他们的一套客户端凭证就足够了,只需提供他们正在模仿的用户的话。例如,RS1告诉RS2“给我bob的数据,这里是RS1的客户端凭证”RS2满足RS1发出请求并因此响应bob的数据。 – 2012-02-24 14:09:31