DotNetOpenAuth OAuth2 Доступ к дополнительным данным

Я использую библиотеку OAuth2 DotNetOpenAuth для обработки авторизации с помощью другой сторонней системы. Все это отлично работает, за исключением того, что сторонняя система возвращает UserId = “testname” в Response с AccessToken.

Мне нужен этот UserId, потому что этот сторонний API требует его как часть своих вызовов API (например: users / {userId} / account).

Используя DotNetOpenAuth, у меня нет доступа к ответу AccessToken, поэтому я не могу получить UserId.

Я вызываю: (_client – это WebServerClient) var state = _client.ProcessUserAuthorization (запрос);

состояние имеет мой AccessToken, но не дополнительные данные, отправленные вниз. Основываясь на исходном коде DotNetOpenAuth, UserId входит в библиотеку, и у меня нет доступа.

Есть ли способ получить этот UserId с помощью DotNetOpenAuth? Или мне нужно отказаться от DotNetOpenAuth и попробовать что-то еще?

Вы можете получить доступ к данным запроса и ответа, IDirectWebRequestHandler и назначив его Channel . Но с текущей реализацией DNOA единственный способ заставить его работать – это применить шаблон прокси к существующему classу UntrustedWebRequestHandler , потому что этот конкретный обработчик передает CachedDirectWebResponse , который имеет stream ответов, который может быть прочитан несколько раз – один раз ваш код для извлечения дополнительных данных, а затем по ProcessUserAuthorization() коду в 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 , в зависимости от того, как он передается (тело, строка запроса). Я не вижу причин прекратить использование DNOA.

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

Обратите внимание, что передача дополнительных параметров вместе с токеном доступа довольно необычна и может привести к потенциальным проблемам безопасности. Это связано с тем, что ответ провайдера идентификации сначала попадает в браузер пользователя и затем отправляется на ваш сервер. Пользователь может изменить ответ поставщика удостоверений, сохранив токен доступа, но заменив идентификатор пользователя на любой другой допустимый идентификатор пользователя.