0

Windows 인증을 사용하는 Sharepoint 2010 응용 프로그램 내에 호스팅되는이 사용자 지정 WCF REST 서비스가 있습니다.Sharepoint 2010에서 Windows 인증으로 호스팅되는 사용자 지정 REST 서비스 사용

.NET 프로젝트 (예 : 콘솔 프로젝트)에서이 서비스를 사용해야하지만 자격 증명이 나를 미치게 만듭니다. 400 - bad request 또는 401 - unauthorized 개의 응답을 많이 받고 있습니다 (일부 인증 여부에 따라 다름).

제가 예를 들어 보겠습니다 :

siteUri는 SP 사이트 (루트/홈페이지) 및 methodUri의 URL 인 XML을 반환하는 서비스 메서드의 URL입니다.

다시 말해이 사이트는 Windows 인증을 받았습니다.

요청 오류

서버는 요청을 처리하는 중 오류가 발생했습니다 : 나는 브라우저를 열고 methodUri에 가면 내가 얻을. 자세한 내용은 서버 로그를 참조하십시오.

그러나 나는 siteUri, 셰어 홈 페이지가로드로 이동 한 후 내가 다시 methodUri를 찾아 볼 수 있습니다 지금은 제대로 XML 응답을 얻는 경우에.

그래서 홈페이지를 탐색 할 때 웹 메소드에 요청할 때 사용되는 쿠키가 저장되어있는 것으로 보입니다. Fiddler에서 요청 확인하기 :

첫 번째 methodUri 요청은 400 코드로 실패하고 요청 헤더에 쿠키가 없습니다. 그런 다음 홈페이지 (siteUri)를 탐색 할 때 인증 자체처럼 보이는 몇 가지 요청/응답이 있습니다. 응답 헤더가 포함

WWW-Authenticate: Negotiate oRswGaADCgEAoxIEEAEAAABDh+CIwTbjqQAAAAA= 
Set-Cookie: WSS_KeepSessionAuthenticated={b89d78b2-063d-4ac4-810e-bde4e04a829e}; path=/ 
Persistent-Auth: true 

을 그리고 마지막으로, methodUri 다시 첫 번째 응답을 검색 할 때하는 401 - 권한이 있지만 직후이 포함 또 다른 요청이 있음을 헤더 마침내 허용됩니다

Cookie: WSS_KeepSessionAuthenticated={b89d78b2-063d-4ac4-810e-bde4e04a829e} 
Authorization: Negotiate oXcwdaADCgEBoloEWE5UTE1TU1AAAwAAAAAAAABYAAAAAAAAAFgAAAAAAAAAWAAAAAAAAABYAAAAAAAAAFgAAAAAAAAAWAAAABXCiOIGAbEdAAAAD37/i76Dl3jNyK8bIRz57fmjEgQQAQAAAPUXp1AtIpqEAAAAAA== 

및 서비스는 해당 XML로 응답합니다.

따라서 브라우저는 현 Windows 사용자를 인증하기 위해이 앞뒤 요청/응답을 처리 할만큼 똑똑합니다.

제 문제는 .NET에서 (3.5 또는 4) defautl 자격 증명을 사용하지 않고 어떻게 할 수 있습니까? 사용자 이름, pwd 및 도메인을 지정해야합니다.

5 일 동안이 문제를 해결하고 HttpWebRequest에서 기본 네트워크 자격 증명을 사용하여 작동하도록 만들었지 만 자격 증명을 수동으로 설정하면 (현재 로그인 한 사용자와 동일하게 사용) 작동하지 않습니다. .

오픈 소스 (루비, 파이썬) 배경에서 왔기 때문에이 모든 것이 불필요하게 지나치게 복잡해졌습니다 (Microsoft에 감사드립니다).

희망 추가 정보가 필요하면 분명히 부탁드립니다. 나는이 현상금으로 내 평판을 바칠 용의가있다.

감사합니다.

+0

클라이언트 설정 방법에 대한 코드를 게시 할 수 있습니까? – Luis

답변

0

글쎄, 고쳐주었습니다.

이것은 사용 끝난 코드입니다. Microsoft가 쉽고 잘 설명하는 것에 감사드립니다.

var siteUri = @"http://sharepoint-site-uri"; 
var methodUri = @"http://sharepoint-site-uri/namespace/service/method"; 
string responseXml = null; 

var request = (HttpWebRequest)WebRequest.Create(siteUri); 
var cc = new CredentialCache { { new Uri(siteUri), "NTLM", new NetworkCredential("user", "pwd", "domain") } }; 
request.Credentials = cc; 

try 
{ 
    // first site request 
    var response = (HttpWebResponse)request.GetResponse(); 
    if (response.StatusCode == HttpStatusCode.OK) 
    { 
     request = (HttpWebRequest)WebRequest.Create(uri); 
     request.CookieContainer = new CookieContainer(); 

     // copy the authentication cookies from the response 
     foreach (Cookie c in response.Cookies) 
     { 
      request.CookieContainer.Add(c); 
     } 

     request.ContentType = "application/xml; charset=utf-8"; 

     // second request, now against the service url 
     using (var reader = new StreamReader(request.GetResponse().GetResponseStream())) 
     { 
      // get the response text 
      responseXml = reader.ReadToEnd(); 
     } 
    } 
} 
catch (Exception e) 
{  
    // handle error 
} 
관련 문제