2013-06-18 1 views
1

Windows 인증으로 보안 설정된 OData 서비스에 대한 연결을 테스트하기 위해 C# 응용 프로그램에 기능을 추가하려고합니다. - 이전에 언급 한 바와 같이 허가되지 않은 오류OData 서비스에 대한 Windows 인증은 C# app에서 "401 - Unauthorized"를 반환하지만 브라우저에서 작동합니다.

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(SERVICE_NAME)); 
CredentialCache myCache = new CredentialCache(); 

myCache.Add(new Uri(SERVICE_NAME), "Negotiate", new NetworkCredential(user, password)); 
resolver.Credentials = myCache; 

// Do a simple request 
request.Credentials = myCache; 
request.PreAuthenticate = true; 
request.KeepAlive = true; 
request.AllowAutoRedirect = true; 
request.CookieContainer = new CookieContainer(); 
object response = request.GetResponse(); // This is where the exception is thrown 

나는 위의 코드를 실행하면, 나는 401가 나타납니다 코드의 다음 블록은 내가이 테스트를 수행하기 위해 사용하고 있습니다 것입니다. 그러나 Fiddler2를 실행하면 코드가 올바르게 작동합니다. 그래서 대신 Wireshark를 사용하고 있습니다. 또한이 서비스는 내 브라우저 (Chrome)에서 완벽하게 작동하며 Wireshark를 사용하여 인증에 대한 HTTP 요청/응답을 비교하면 Chrome에서 다음을 제외하고 거의 동일하다는 것을 알 수 있습니다. 수락, 사용자 에이전트 , Accept-Encoding 및 Accept-Language 헤더가 있지만 C# 응용 프로그램에는 이러한 헤더가 없습니다. 유일한 차이점은 내 C# 앱이 NTLM 헤더에 "Negotiate Seal"플래그를 설정하는 반면 Chrome은이 플래그를 설정하지 않는다는 것입니다.

이러한 차이에도 불구하고 C# 응용 프로그램에서 302- 리디렉션을 반환 할 때까지 인증 단계가 정상적으로 작동하는 것 같습니다.이 시점에서 응용 프로그램은 새로 리디렉션 된 URI에서 GET을 시도하고 다시 401을 반환합니다 Chrome이 유사한 GET을 수행하면 HTTP 200 - OK를 수신하고 메리 방식으로 진행합니다.

그래서 어떤 아이디어가이 문제를 일으킬 수 있습니까? 서비스에 문제가 있습니까? 또는 내 코드?

고맙습니다. -Erik

답변

0

좋아, 2 일간의 연구와 나는 그 해답을 발견했다. 위 코드에서 3 번째 줄은 서비스의 전체 URI (".../Northwind/Northwind.svc")를 사용하여 요청이 리디렉션 될 때 자격 증명이 더 이상 새 URI에 적용되지 않습니다. 해결책은 URI의 시작 부분 ("...") 만 전달하는 것이 었습니다. 내 멍청한 실수.