【问题标题】:DotNetOpenAuth OAuth2 Accessing Extra DataDotNetOpenAuth OAuth2 访问额外数据
【发布时间】:2014-12-24 16:08:48
【问题描述】:

我正在使用 DotNetOpenAuth 的 OAuth2 库来处理与另一个第三方系统的授权。这一切都很好,除了第三方系统在带有 AccessToken 的响应中返回 UserId="testname"。

我需要那个 UserId,因为这个第三方 API 需要它作为其 API 调用的一部分(例如:users/{userId}/account)。

使用 DotNetOpenAuth,我无权访问 AccessToken 响应,因此无法获取 UserId。

我在打电话:(_client 是一个 WebServerClient) var state = _client.ProcessUserAuthorization(request);

state 有我的 AccessToken,但没有发送下来的额外数据。根据 DotNetOpenAuth 源代码,UserId 进入了库,我没有任何访问权限。

是否可以使用 DotNetOpenAuth 获取该 UserId?还是我需要放弃 DotNetOpenAuth 并尝试其他方法?

【问题讨论】:

    标签: c# .net oauth-2.0 dotnetopenauth


    【解决方案1】:

    您可以通过实现IDirectWebRequestHandler 并将其分配给Channel 来访问请求和响应数据。但是对于 DNOA 的当前实现,我让它工作的唯一方法是将代理模式应用于现有的 UntrustedWebRequestHandlerclass,这是因为这个特定的处理程序传递了一个 CachedDirectWebResponse,它有一个可以读取多个的响应流次 - 一次由您的代码检索其他数据,然后由下游代码向ProcessUserAuthorization()

    这是自定义IDirectWebRequestHandler的代码:

    public class RequestHandlerWithLastResponse : IDirectWebRequestHandler
        {
        private readonly UntrustedWebRequestHandler _webRequestHandler;
        public string LastResponseContent { get; private set; }
    
        public RequestHandlerWithLastResponse(UntrustedWebRequestHandler webRequestHandler)
            {
            if (webRequestHandler == null) throw new ArgumentNullException( "webRequestHandler" );
            _webRequestHandler = webRequestHandler;
            }
    
        public bool CanSupport( DirectWebRequestOptions options )
            {
            return _webRequestHandler.CanSupport( options );
            }
    
        public Stream GetRequestStream( HttpWebRequest request )
            {
            return _webRequestHandler.GetRequestStream( request, DirectWebRequestOptions.None );
            }
    
        public Stream GetRequestStream( HttpWebRequest request, DirectWebRequestOptions options )
            {
            return _webRequestHandler.GetRequestStream( request, options );
            }
    
        public IncomingWebResponse GetResponse( HttpWebRequest request )
            {
            var response = _webRequestHandler.GetResponse( request, DirectWebRequestOptions.None );
    
            //here we actually getting the response content
            this.LastResponseContent = GetResponseContent( response );
    
            return response;
            }
    
        public IncomingWebResponse GetResponse( HttpWebRequest request, DirectWebRequestOptions options )
            {
            return _webRequestHandler.GetResponse( request, options );
            }
    
        private string GetResponseContent(IncomingWebResponse response)
            {
    
            MemoryStream stream = new MemoryStream();
            response.ResponseStream.CopyTo(stream);
    
            stream.Position = 0;
            response.ResponseStream.Position = 0;
    
            using (var sr = new StreamReader(stream))
                {
                return sr.ReadToEnd();
                }
            }
        }
    

    这就是我们应用它并获取响应数据的方式:

    var h = new RequestHandlerWithLastResponse(new UntrustedWebRequestHandler()); ;
    _client.Channel.WebRequestHandler = h;
    
    var auth = _client.ProcessUserAuthorization( request );
    
    //convert response json to POCO
    var extraData = JsonConvert.DeserializeObject<MyExtraData>( h.LastResponseContent );
    

    【讨论】:

      【解决方案2】:

      直接从请求中读取 id,在您调用 ProcessUserAuthorization 之后的行,具体取决于它的传递方式(正文、查询字符串)。我认为没有任何理由停止使用 DNOA。

      var auth = client.ProcessUserAuthorization();
      if ( auth != null )
      {
         // this is where you could still access the identity provider's request
         ...
      

      请注意,将附加参数与访问令牌一起传递是相当少见的,并且可能会导致潜在的安全问题。这是因为身份提供者的响应首先到达用户的浏览器,然后提交到您的服务器。用户可以通过保留访问令牌但用任何其他有效用户 ID 替换用户 ID 来更改身份提供者的响应。

      【讨论】:

      • 我认为这不会起作用,因为我拥有的请求对象不是具有访问令牌和用户 ID 的对象。它是用于获取访问令牌的代码。在 DNOA 内部,它对访问令牌发出新请求,我无权访问该请求,它只返回访问令牌和刷新数据。我同意它不应该以这种方式工作,但我只是在使用另一家公司提供的服务。
      • 你是对的,如果这是授权码流程,那么你还没有令牌。您必须手动发出对令牌的请求,这对 DNOA 有点意义,因为 DNOA 在一次调用 ProcessUserAuthorization 时同时进行。
      猜你喜欢
      • 2013-09-13
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多