【发布时间】:2013-08-15 17:02:44
【问题描述】:
我已经使用 DotNetOpenAuth 创建了一个 OAuth2 授权服务器,它工作正常 - 我正在使用资源所有者密码流,并成功地将用户凭据交换为访问令牌。
我现在想使用该访问令牌从 ServiceStack API 中的安全端点检索数据,但我不知道该怎么做。我检查了 ServiceStack 中包含的 Facebook、Google 等提供商,但不清楚我是否应该遵循相同的模式。
我想要实现的(我认为!)是
- OAuth 客户端(我的应用)要求资源所有者(“Catherine Smith”)提供凭据
- 客户端向授权服务器提交请求,收到一个访问令牌
-
客户端从资源服务器请求一个安全的资源 (
GET /users/csmith/photos)-
访问令牌包含在 HTTP 标头中,例如
Authorization: Bearer 1234abcd...
-
访问令牌包含在 HTTP 标头中,例如
- 资源服务器解密访问令牌以验证资源所有者的身份
- 资源服务器检查资源所有者是否有权访问请求的资源
- 资源服务器将资源返回给客户端
第 1 步和第 2 步有效,但我不知道如何将 DotNetOpenAuth 资源服务器代码与 ServiceStack 授权框架集成。
在某处有我将如何实现这一目标的示例吗?我在 How to build secured api using ServiceStack as resource server with OAuth2.0? 找到了类似的 StackOverflow 帖子,但它不是一个完整的解决方案,而且似乎没有使用 ServiceStack 授权提供程序模型。
编辑:更多细节。这里有两个不同的网络应用程序。一个是身份验证/授权服务器 - 它不托管任何客户数据(即没有数据 API),但公开 /oauth/token 方法,该方法将接受用户名/密码并返回 OAuth2 访问令牌和刷新令牌,以及提供令牌刷新功能。这是基于 ASP.NET MVC 构建的,因为它与 DotNetOpenAuth 中包含的 AuthorizationServer 示例几乎相同。这可能会在以后被替换,但现在它是 ASP.NET MVC。
对于实际的数据 API,我使用的是 ServiceStack,因为我发现它比 WebAPI 或 MVC 在公开 ReSTful 数据服务方面要好得多。
所以在下面的例子中:
客户端是在用户本地机器上运行的桌面应用程序,Auth服务器是ASP.NET MVC + DotNetOpenAuth,资源服务器 strong> 是 ServiceStack
所需的 DotNetOpenAuth 代码的特定 sn-p 是:
// scopes is the specific OAuth2 scope associated with the current API call.
var scopes = new string[] { "some_scope", "some_other_scope" }
var analyzer = new StandardAccessTokenAnalyzer(authServerPublicKey, resourceServerPrivateKey);
var resourceServer = new DotNetOpenAuth.OAuth2.ResourceServer(analyzer);
var wrappedRequest = System.Web.HttpRequestWrapper(HttpContext.Current.Request);
var principal = resourceServer.GetPrincipal(wrappedRequest, scopes);
if (principal != null) {
// We've verified that the OAuth2 access token grants this principal
// access to the requested scope.
}
所以,假设我走在正确的轨道上,我需要做的是在 ServiceStack 请求管道中的某处运行该代码,以验证 API 请求中的 Authorization 标头是否代表已授予访问权限的有效委托人请求的范围。
我开始认为实现这一点最合乎逻辑的地方是在我用来装饰我的 ServiceStack 服务实现的自定义属性中:
using ServiceStack.ServiceInterface;
using SpotAuth.Common.ServiceModel;
namespace SpotAuth.ResourceServer.Services {
[RequireScope("hello")]
public class HelloService : Service {
public object Any(Hello request) {
return new HelloResponse { Result = "Hello, " + request.Name };
}
}
}
这种方法还允许指定每个服务方法所需的范围。然而,这似乎与 OAuth2 背后的“可插拔”原则以及 ServiceStack 的 AuthProvider 模型中内置的可扩展性挂钩完全相反。
换句话说 - 我担心我会用鞋子敲钉子,因为我找不到锤子......
【问题讨论】:
-
这个包可能会提供一个有用的代码示例:Configure an ServiceStack backend to accept OAuth2 Bearer tokens
-
至于授权,关于内置角色和权限支持的推荐阅读在这里:stackoverflow.com/questions/12095094/…,这是一个比您链接的更完整的添加自定义 OAuth 提供程序的示例:davetimmins.wordpress.com/2013/04/12/… - - 你是对的。我没有看到任何将 OAuth 身份验证与角色和权限授权完全集成在一起的示例。
-
再次返回。 ServiceStack 在您的实施中扮演什么角色?我一直以为SS会提供资源,需要通过资源服务器确认授权。但是你上面的大纲,让资源服务器将资源返回给客户端。这就引出了一个问题——在那种情况下,你需要什么服务堆栈?而且,如果您使用 ServiceStack 将资源传递给客户端,为什么需要 DNOA 资源服务器? SS 是否为客户端提供了一个门面,隐藏了资源和身份验证服务器实现的细节?
标签: oauth-2.0 servicestack dotnetopenauth