.NET에서 기본 인증을 사용하는 API에 IIS의 응용 프로그램 풀을 실행하는 ID의 자격 증명을 보낼 수 있는지 궁금합니다. 성공적으로 응용 프로그램 풀에서 ID 컨텍스트를 검색 할 수있었습니다. 그러나 모든 예제에서 Basic Auth를 사용합니다. 그들은 모두 수동으로 Authorization 헤더를 요청에 추가해야 할 필요가있는 것처럼 보입니다. 이 문제는 직접적으로 Windows ID의 암호에 액세스 할 수 없기 때문에 수동으로 기본 인증 토큰을 만들 수 없기 때문에 발생합니다. .DefaultCredentials 속성을 사용하려고 시도했지만 Auth 헤더를 생성하지 못하여 401과 함께 응답이 실패합니다. 이것이 가능하지 않으면 다른 접근 방식을 취할 것이지만 그렇게하기 전에 확인하고 싶습니다. 전체 코드 샘플은 내가 여러 가지 방법을 시도했지만 모두 같은 401응용 프로그램 풀 자격 증명을 사용하여 기본 인증을 사용하여 API 호출 만들기
using (var impersonationContext = WindowsIdentity.Impersonate(IntPtr.Zero))
{
HttpWebRequest request1 = (HttpWebRequest)WebRequest.Create("url");
HttpClient request2 = new HttpClient();
WebClient request3 = new WebClient();
WebRequest request4 = WebRequest.Create("url");
try
{
// this code is now using the application pool indentity
try
{
//Method 1
//request1.UseDefaultCredentials = true;
//request1.PreAuthenticate = true;
//string encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(WindowsIdentity.GetCurrent().Name + ":" + "No password :("));
//request1.Headers.Add("Authorization", "Basic " + WindowsIdentity.GetCurrent().Token.ToString());
//HttpWebResponse response = (HttpWebResponse)request1.GetResponse();
//using (var reader = new StreamReader(response.GetResponseStream()))
//{
// JavaScriptSerializer js = new JavaScriptSerializer();
// var objText = reader.ReadToEnd();
// Debug.WriteLine(objText.ToString());
//}
////Method 2
//client.DefaultRequestHeaders.Accept.Clear();
//client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
//client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", WindowsIdentity.GetCurrent().Token.ToString());
//HttpResponseMessage response2 = client.GetAsync("url").Result; //.Result forces sync instead of async.
//var result = response2.Content.ReadAsStringAsync().Result;
//Debug.WriteLine(result);
//Method 3
//client2.Credentials = CredentialCache.DefaultNetworkCredentials;
//var result2 = client2.DownloadString("url");
//Debug.WriteLine(result2);
//Method 4
//request4.Credentials = CredentialCache.DefaultCredentials;
//string result4;
//using (var sr = new StreamReader(request4.GetResponse().GetResponseStream()))
//{
// result4 = sr.ReadToEnd();
//}
//Debug.WriteLine(result4);
}
catch (Exception ex)
{
throw new Exception("API Call Failed: " + ex.ToString() + " for " + WindowsIdentity.GetCurrent().Name + " request: " + request4.Headers.ToString());
}
}
finally
{
if (impersonationContext != null)
{
impersonationContext.Undo();
}
}
이것은 많은 정보를 원하는 것처럼 보입니다. http://stackoverflow.com/questions/12212116/how-to-get-httpclient-to-pass-credentials-along-with-the -request –
코드를 유스 케이스로 업데이트 한 후에도 여전히 401을 받았습니다. 요청 헤더를 검사했는데 인증 헤더가 여전히 빠져서 실패한 것입니다. – user1732364
기본 인증으로 제한되어 있습니까? 아마도 NTLM은 API 호출이 응용 프로그램이 실행중인 동일한 스레드 (httpclient 대 webclient)에있는 한 작동 할 수 있습니까? –