2012-10-15 2 views
1

나는 클라이언트, 인증 서버 (서버, 서버)를 관리하는 최신 릴리스 4.1.0 (nuget를 통해)에서 작동하도록 GetClientAccessToken 흐름을 얻으려고 노력했습니다. 및 리소스 서버.NetworkCredential에 의해 clientIdentifier가 null로 덮어 쓰여진 GetClientAccessToken

프로토 타입을 시작한 상황은 Windows 클라이언트 응용 프로그램 (내 클라이언트 - 결국 WinRT이지만 단순한 MVC 4 응용 프로그램이 될 것입니다.)과 WebAPI 프로젝트. 부분 승인 서버를 동일한 WebAPI 프로젝트의 컨트롤러로 노출시키고 있습니다.

매번 (클라이언트 유형 (예 : UserAgentClient 또는 WebServerClient)과 상관없이 보입니다.) GetClientAccessToken을 요청합니다. 요청이 인증 서버에 요청할 때 요청의 일부로 clientIdentifier가 없으므로 요청이 실패합니다 로 : 나는 DNOA 내가 클라이언트에서 구축하고있어 기본적으로 자격 증명에 소스를 통해 디버깅 한

2012-10-15 13:40:16,333 [41 ] INFO {Channel} Prepared outgoing AccessTokenFailedResponse (2.0) message for <response>: 
error: invalid_client 
error_description: The client secret was incorrect. 

ClientBase.RequestAccessToken 내부 NetworkCredential.ApplyClientCredential에 의해 전멸 얻고있다. 합리적인 것으로 clientIdentifier를 수정하면 나머지 코드를 추적하여 정확한 조회/확인이 이루어 지므로 인증 서버 코드가 정상임을 확신 할 수 있습니다.

내 테스트 클라이언트는 현재 다음과 같습니다

public class AuthTestController : Controller 
{ 
    public static AuthorizationServerDescription AuthenticationServerDescription 
    { 
     get 
     { 
      return new AuthorizationServerDescription() 
      { 
       TokenEndpoint = new Uri("http://api.leave-now.com/OAuth/Token"), 
       AuthorizationEndpoint = new Uri("http://api.leave-now.com/OAuth/Authorise") 
      }; 
     } 
    } 

    public async Task<ActionResult> Index() 
    { 
     var wsclient = new WebServerClient(AuthenticationServerDescription, "KieranBenton.LeaveNow.Metro", "testsecret"); 

     var appclient = new DotNetOpenAuth.OAuth2.UserAgentClient(AuthenticationServerDescription, "KieranBenton.LeaveNow.Metro", "testsecret"); 
     var cat = appclient.GetClientAccessToken(new[] { "https://api.leave-now.com/journeys/" }); 

     // Acting as the Leave Now client we have access to the users credentials anyway 
     // TODO: CANNOT do this without SSL (turn off the bits in web.config on BOTH sides) 
     /*var state = client.ExchangeUserCredentialForToken("kieranbenton", "password", new[] { "https://api.leave-now.com/journeys/" }); 

     // Attempt to talk to the APIs WITH the access token 
     var resourceclient = new OAuthHttpClient(state.AccessToken); 
     var response = await resourceclient.GetAsync("https://api.leave-now.com/journeys/"); 
     string sresponse = await response.Content.ReadAsStringAsync();*/ 

     // A wrong one 
     /*var wresourceclient = new OAuthHttpClient("blah blah"); 
     var wresponse = await wresourceclient.GetAsync("https://api.leave-now.com/journeys/"); 
     string wsresponse = await wresponse.Content.ReadAsStringAsync(); 

     // And none 
     var nresourceclient = new HttpClient(); 
     var nresponse = await nresourceclient.GetAsync("https://api.leave-now.com/journeys/"); 
     string nsresponse = await nresponse.Content.ReadAsStringAsync();*/ 

     return Content(""); 
    } 
} 

나는이 문제를 방지하는 방법을 알아낼 수 없습니다 또는 디자인에 의해 내가 잘못 뭘하는지합니다.

도움을 주시면 감사하겠습니다.

답변

2

NetworkCredentialApplicator은 보내는 메시지에서 client_id와 secret를 지우지 만 HTTP Authorization 헤더로 적용합니다. 그러나 HttpWebRequest은 출구에서 해당 헤더를 지우고 서버가 HTTP 오류 및 WWW-Authenticate 헤더로 응답하는 경우에만 해당 값을 복원합니다. .NET에서 처음으로 아웃 바운드 요청에 대한 자격 증명을 표시하지 않는 것은 매우 이상한 행동입니다.

인증 서버의 응답이 정확하면 (적어도 .NET 클라이언트가 기대하는 것) 요청이 두 번 나오고 두 번째로 작업합니다. 그렇지 않은 경우 PostParameterApplicator을 대신 사용해보세요.

+0

감사합니다. Andrew - 얼마나 이상한가요? PostParameterApplicator를 대신 사용하는 방법에 대한 예가 있습니까? 클라이언트의 동작 부분을 제어하는 ​​방법을 잘 모르겠습니다. –

+1

스크래치, 나는 그것을하는 방법을 알아 냈다'appclient.ClientCredentialApplicator = ClientCredentialApplicator.PostParameter ("testsecret");'. 감사 앤드류! –

+0

죄송합니다. Andrew - me again. NetworkCredentialApplicator를 작동시키는 방법에 대한 지침이 있습니까? 모든 것을 나는 401을 함정에 넣지 않고 다시 시도했다. –

관련 문제