DotNetOpenAuth OAuth2 访问额外数据

本文关键字:数据 访问 OAuth2 DotNetOpenAuth | 更新日期: 2023-09-27 18:35:10

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

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

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

我正在打电话:(_client是一个网络服务器客户端)var 状态 = _client。进程用户授权(请求);

状态有我的访问令牌,但没有发送下来的额外数据。基于DotNetOpenAuth源代码,UserId进入库内,我没有任何访问权限。

有没有办法使用DotNetOpenAuth来获取该UserId?还是我需要放弃DotNetOpenAuth并尝试其他方法?

DotNetOpenAuth OAuth2 访问额外数据

您可以通过

实现IDirectWebRequestHandler并将其分配给Channel来访问请求和响应数据。但是对于 DNOA 的当前实现,我让它工作的唯一方法是将代理模式应用于现有的 UntrustedWebRequestHandler 类,这是因为这个特定的处理程序传递了一个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 );

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

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

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