2014-12-24 4 views
3

다른 타사 시스템과의 인증을 처리하기 위해 DotNetOpenAuth의 OAuth2 라이브러리를 사용하고 있습니다. 제 3 자 시스템이 AccessToken을 사용하여 응답에서 UserId = "testname"을 반환한다는 것을 제외하면 모두 훌륭합니다.DotNetOpenAuth OAuth2 추가 데이터 액세스

이 타사 API가 API 호출 (예 : 사용자/{userId}/계정)의 일부로 필요하기 때문에 해당 UserId가 필요합니다.

DotNetOpenAuth를 사용하면 AccessToken 응답에 액세스 할 수 없으므로 UserId를 가져올 수 없습니다.

전화 : (_client는 WebServerClient입니다.) var state = _client.ProcessUserAuthorization (request);

주에는 내 AccessToken이 있지만 추가 데이터는 전송되지 않습니다. DotNetOpenAuth 소스 코드에 따라 UserId가 라이브러리 내부에 들어 왔으며 액세스 권한이 없습니다.

어쨌든 DotNetOpenAuth를 사용하여 해당 UserId를 가져올 수 있습니까? 아니면 DotNetOpenAuth를 포기하고 다른 것을 시도해야합니까?

답변

0

전달 방법 (본문, 쿼리 문자열)에 따라 ProcessUserAuthorization을 호출 한 직후에 요청에서 바로 ID를 읽습니다. DNOA 사용을 중단 할 이유가 없습니다.

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

추가 매개 변수를 액세스 토큰과 함께 전달하는 것은 흔하지 않으며 잠재적 인 보안 문제가 발생할 수 있습니다. 이것은 ID 공급자의 응답이 먼저 사용자의 브라우저에 도착한 다음 서버에 제출되기 때문입니다. 사용자는 액세스 토큰을 유지하면서 사용자 ID를 다른 유효한 사용자 ID로 바꾸면 ID 공급자의 응답을 변경할 수 있습니다.

+0

내가 그 일을 생각하지 않습니다를하기 때문에 그 요청 객체 I have는 액세스 토큰 및 사용자 ID가있는 사용자가 아닙니다. 액세스 토큰을 얻는 데 사용 된 코드가있는 것입니다. DNOA 내부에서 Access 토큰에 대한 새로운 요청을하고 요청에 대한 액세스 권한이 없으며 액세스 토큰과 새로 고침 데이터 만 반환합니다. 이 방법으로는 안된다는 데 동의하지만 다른 회사에서 제공하는 서비스를 사용하고 있습니다. – timothymcgrath

+0

맞습니다. 인증 코드 흐름 인 경우 아직 토큰이 없습니다. DNOA가 'ProcessUserAuthorization'을 한 번 호출 할 때 DNOA가 약간의 의미를 갖는 토큰에 대한 요청을 수동으로 발행해야합니다. –

1

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); 
관련 문제