2016-10-19 2 views
1

인트라넷 MVC.NET 웹 사이트가 있습니다. MySite이라고 부르 자. 에서 MySite 다른 인트라넷 웹 사이트로 웹 요청을 보내려고합니다. 다른 웹 사이트로 전화하십시오. OtherSite. 두 웹 사이트는 모두 동일한 도메인에 있으며 IIS에서 실행됩니다. 두 웹 사이트가 사용하는 :다른 서버에 웹 요청을 할 때 가장 문제가 발생합니다.

<authentication mode="Windows" /> 
<authorization> 
    <allow verbs="OPTIONS" users="*" /> 
    <deny users="?" /> 
</authorization> 

내 사이트은 웹 브라우저 (크롬, IE)와 인증 된 사용자 (동일한 도메인)에 의해 액세스 할 수 있습니다. 해당 사용자 고객으로 전화를 걸자. 클라이언트의 자격 증명 MySite기타 사이트을 사용하는 경우 클라이언트을 사용해야합니다. here을 제안, WebClient

var request = WebRequest.CreateHttp(uri); 
request.Credentials = CredentialCache.DefaultCredentials; 
request.ImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; 
var response = request.GetResponse(); 
return response; 

;

WebRequest으로 :

enter image description here

나는 다음과 같은 시도

와 주변이 코드없이 모두
using (var client = new WebClient { UseDefaultCredentials = true }) 
{ 
    client.Headers.Add(HttpRequestHeader.ContentType, "application/json; charset=utf-8"); 
    var data = client.DownloadData(uri); 
    return data; 
} 

는 :

var wi = (System.Security.Principal.WindowsIdentity)HttpContext.Current.User.Identity; 
var wic = wi.Impersonate(); 
try 
{ 
    // Code for making request goes here... 
} 
catch (Exception exc) 
{ 
    // handle exception 
} 
finally 
{ 
    wic.Undo(); 
} 

나는 내 사이트의 Web.config에 함께하고 <identity impersonate="true" />없이 시도했습니다.

는 최대한 빨리이 클라이언트를 가장하려고으로 나는 401에서 OtherSite를 얻을. 그리고 IIS 로그에서 OtherSite 로그를 확인하면 자격 증명이 요청과 함께 전달되지 않는 것처럼 보입니다.

사용자를 가장하지 않으면 모두 잘됩니다. 그러나 가장하려고하면 실패하고 401을 반환합니다. Active Directory에서 어떤 작업을해야합니까? 나는 답변이 위임 인 this question을 보았습니다. 그게 문제 야? 가장 할 때 401의 이유는 무엇입니까? OtherSite

IIS에서 로그는 내가 가장 할 때 다음과 같습니다

2016-10-19 07:33:26 2a01:9080:700:0:3fe7:b92a:552:1246 GET /odata/$metadata - 80 - 2a01:9080:700:0:8d90:4bc0:2ffd:d088 - - 401 0 0 0 
2016-10-19 07:33:26 2a01:9080:700:0:3fe7:b92a:552:1246 GET /odata/$metadata - 80 - 2a01:9080:700:0:8d90:4bc0:2ffd:d088 - - 401 1 2148074252 0 

내가 가장하지 않을 때 그들은 다음과 같이 :

2016-10-19 07:57:11 2a01:9080:700:0:3fe7:b92a:552:1246 GET /odata/$metadata - 80 MyDomain\SVC_ServiceAccount1 2a01:9080:700:0:8d90:4bc0:2ffd:d088 - - 200 0 0 0 
2016-10-19 07:57:11 2a01:9080:700:0:3fe7:b92a:552:1246 GET /odata/$metadata - 80 MyDomain\SVC_ServiceAccount1 2a01:9080:700:0:8d90:4bc0:2ffd:d088 - - 200 0 0 0 

나는 서비스 계정을 가지고 위의 로그에 MyDomain \ SVC_ServiceAccount1이라는 응용 프로그램 풀이 있습니다. 실제 이름은 다른 것입니다 ...

+0

(주의 내가 사용 HttpClient를하지만), 사용자는 Kerberos 또는'을 사용하여 인증해야 auth/plaintext'라고합니다. Kerberos 인 경우 IIS 프로세스를 "위임에 대해 신뢰할 수 있어야합니다." – Ben

+0

@Ben, 감사합니다. 시도해 볼게. – smoksnes

답변

0

MVC 사이트가 IIS에서 실행중인 경우 실행중인 응용 프로그램 풀은 무엇입니까?

특정 ID로 실행되도록 해당 응용 프로그램 풀을 설정해야 할 수도 있습니다. 그렇지 않으면 컴퓨터 ID를 사용하여 원격 리소스에 액세스하려고 시도합니다. (주석에 응답)

편집

나의 다음 생각은 IIS가 익명 액세스를 위해 구성되었는지이었고,이 것을 전달되는 무슨이었다. IIS 관리 콘솔에서 해당 사이트에 대한 인증을 볼 때 그 내용은 무엇입니까? 여기서 말하는 설정은 승인 인증이 아닙니다.

IIS에서 익명 인증을 사용하지 않으려 고 시도한 경우 (느린 작업자 프로세스가 걸려 있지 않은지 확인한 후 iisreset을 수행하고) Windows 인증 만 남겨두고 무슨 일이 일어나게할까요?

이 내 코드에서 설정을 수행하는 방법이다 OtherSite에 자격 증명을 위임하는 내 사이트 위해서는

protected HttpClient SetupHttpClient(string uri) 
{ 
    HttpClient client = new HttpClient {BaseAddress = uri}; 
    client.DefaultRequestHeaders.Accept.Clear();    
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
    return client; 
} 
+0

나는이 질문을 업데이 트했다. 앱 풀이 실행중인 특정 서비스 계정이 있습니다. – smoksnes

+0

익명 인증이 해제되어 있습니까 (IIS에서)? – noonand

+0

예. ''을 허용하지만,''를 허용합니다. 그것은 질문의 맨 위에 있습니다. – smoksnes