gpt4 book ai didi

oauth-2.0 - 如何通过 DotNetOpenAuth 使用 OAuth2 访问 token 授权对 ServiceStack 资源的访问?

转载 作者:行者123 更新时间:2023-12-04 00:56:30 25 4
gpt4 key购买 nike

我已经使用 DotNetOpenAuth 创建了一个 OAuth2 授权服务器,它工作正常 - 我正在使用资源所有者密码流,并成功地将用户凭据交换为访问 token 。

我现在想使用该访问 token 从 ServiceStack API 中的安全端点检索数据,但我不知道该怎么做。我检查了 ServiceStack 中包含的 Facebook、Google 等提供商,但不清楚我是否应该遵循相同的模式。

我想要实现的(我认为!)是

  • OAuth 客户 (我的应用程序)询问 资源所有者 ('Catherine Smith') 获取凭证
  • 客户 提交请求授权服务器 ,收到 访问 token
  • 客户 请求安全 资源 来自 资源服务器 (GET /users/csmith/photos)
  • 访问 token 包含在 HTTP header 中,例如Authorization: Bearer 1234abcd...
  • 资源服务器 解密访问 token 验证 的身份资源所有者
  • 资源服务器 检查 资源所有者 可以访问请求的 资源
  • 资源服务器 返回 资源 客户

  • 第 1 步和第 2 步正在工作,但我不知道如何将 DotNetOpenAuth 资源服务器代码与 ServiceStack 授权框架集成。

    有没有一个例子说明我将如何实现这一目标?我在 How to build secured api using ServiceStack as resource server with OAuth2.0? 找到了类似的 StackOverflow 帖子但它不是一个完整的解决方案,并且似乎没有使用 ServiceStack 授权提供者模型。

    编辑:再详细一点。这里有两个不同的网络应用程序。一个是身份验证/授权服务器 - 它不托管任何客户数据(即没有数据 API),但公开/oauth/token 方法,该方法将接受用户名/密码并返回 OAuth2 访问 token 和刷新 token ,以及提供 token 刷新功能。这是基于 ASP.NET MVC 构建的,因为它与 DotNetOpenAuth 中包含的 AuthorizationServer 示例几乎相同。这可能会在以后被替换,但现在它是 ASP.NET MVC。

    对于实际的数据 API,我使用的是 ServiceStack,因为我发现它比 WebAPI 或 MVC 在公开 ReSTful 数据服务方面要好得多。

    所以在下面的例子中:

    sequence diagram

    客户 是在用户本地机器上运行的桌面应用程序, 认证服务器是 ASP.NET MVC + DotNetOpenAuth, 资源服务器是服务栈

    所需的特定 DotNetOpenAuth 代码片段是:
    // 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 header 是否代表已授予对所请求范围的访问权限的有效主体.

    我开始认为实现这一点最合乎逻辑的地方是在我用来装饰我的 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 模型中内置的可扩展性 Hook 完全相反。

    换句话说-我担心我会用鞋子敲钉子,因为我找不到锤子...

    最佳答案

    好的,在使用调试器对各种库进行大量单步调试之后,我认为您可以这样做:https://github.com/dylanbeattie/OAuthStack

    有两个关键的集成点。首先,在服务器上使用自定义过滤器属性来装饰应使用 OAuth2 授权保护的资源端点:

     /// <summary>Restrict this service to clients with a valid OAuth2 access 
    /// token granting access to the specified scopes.</summary>
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true)]
    public class RequireOAuth2ScopeAttribute : RequestFilterAttribute {
    private readonly string[] oauth2Scopes;
    public RequireOAuth2ScopeAttribute(params string[] oauth2Scopes) {
    this.oauth2Scopes = oauth2Scopes;
    }

    public override void Execute(IHttpRequest request, IHttpResponse response, object requestDto) {
    try {
    var authServerKeys = AppHostBase.Instance.Container.ResolveNamed<ICryptoKeyPair>("authServer");
    var dataServerKeys = AppHostBase.Instance.Container.ResolveNamed<ICryptoKeyPair>("dataServer");
    var tokenAnalyzer = new StandardAccessTokenAnalyzer(authServerKeys.PublicSigningKey, dataServerKeys.PrivateEncryptionKey);
    var oauth2ResourceServer = new DotNetOpenAuth.OAuth2.ResourceServer(tokenAnalyzer);
    var wrappedRequest = new HttpRequestWrapper((HttpRequest)request.OriginalRequest);
    HttpContext.Current.User = oauth2ResourceServer.GetPrincipal(wrappedRequest, oauth2Scopes);
    } catch (ProtocolFaultResponseException x) {
    // see the GitHub project for detailed error-handling code
    throw;
    }
    }
    }

    其次,这是您连接到 ServiceStack HTTP 客户端管道并使用 DotNetOpenAuth 添加 OAuth2 Authorization: Bearer {key} 的方式。传出请求的 token :
    // Create the ServiceStack API client and the request DTO
    var apiClient = new JsonServiceClient("http://api.mysite.com/");
    var apiRequestDto = new Shortlists { Name = "dylan" };

    // Wire up the ServiceStack client filter so that DotNetOpenAuth can
    // add the authorization header before the request is sent
    // to the API server
    apiClient.LocalHttpWebRequestFilter = request => {
    // This is the magic line that makes all the client-side magic work :)
    ClientBase.AuthorizeRequest(request, accessTokenTextBox.Text);
    }

    // Send the API request and dump the response to our output TextBox
    var helloResponseDto = apiClient.Get(apiRequestDto);

    Console.WriteLine(helloResponseDto.Result);

    授权请求会成功;缺少 token 、过期 token 或范围不足的请求将引发 WebServiceException
    这仍然是非常概念验证的东西,但似乎工作得很好。我欢迎任何比我更了解 ServiceStack 或 DotNetOpenAuth 的人提供反馈。

    关于oauth-2.0 - 如何通过 DotNetOpenAuth 使用 OAuth2 访问 token 授权对 ServiceStack 资源的访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18257753/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com