DotNetOpenAuth OAuth2访问额外数据

我正在使用DotNetOpenAuth的OAuth2库来处理与另一个第三方系统的授权。 这一切都很有效,除了第三方系统在使用AccessToken的Response中返回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并尝试其他方法?

您可以通过实现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( h.LastResponseContent ); 

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

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

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