2017-05-01 1 views
0

.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(); 
       } 
      } 
+0

이것은 많은 정보를 원하는 것처럼 보입니다. http://stackoverflow.com/questions/12212116/how-to-get-httpclient-to-pass-credentials-along-with-the -request –

+0

코드를 유스 케이스로 업데이트 한 후에도 여전히 401을 받았습니다. 요청 헤더를 검사했는데 인증 헤더가 여전히 빠져서 실패한 것입니다. – user1732364

+0

기본 인증으로 제한되어 있습니까? 아마도 NTLM은 API 호출이 응용 프로그램이 실행중인 동일한 스레드 (httpclient 대 webclient)에있는 한 작동 할 수 있습니까? –

답변

0

응용 프로그램 풀 ID 및 기본 인증은 두 개의 서로 다른 목적을 제공하여 결국 나는 그 혼합하지 않는 것이 좋습니다 ... 다음과 같습니다. 앱 풀 ID의 비밀번호를 알지 못한다고 언급 했으므로이 설명은 자명합니다. 또한 응용 프로그램 풀 ID를 사용하면 API가 파일 공유에 액세스하는 등의 시스템 리소스에 액세스 할 수 있습니다.

반면 Basic Auth를 사용하면 전체적으로 API를 열어서 액세스하는 모든 사람을 보호 할 수 있습니다. UserName을 알고있는 사용자를 제외하고 : 각 HttpRequest (UserName과 함께 HttpHeader 포함 : Base64의 암호)와 함께 전달되어야하는 암호.

이러한 사실을 고려할 때 API 개발자는 모든 사용자와 UserName 및 Password를 공유해야 할 때 App Pool Identity 자격 증명을 공유하지 않는 것이 좋습니다.

저는 App Pool Identity 및 Basic Auth와 함께 작업했으며이 두 가지를 별도로 유지하는 것이 좋습니다.

+0

수정하십시오. 주로 시스템에 대한 액세스를 제어하는 ​​서비스 계정 등을 사용합니다.이 사용 사례를 API 액세스로 확장하기 만하면됩니다. 스트림없는 방식으로이를 수행하기 위해 .NET 응용 프로그램은 서비스 계정 자격 증명을 재사용하여 리소스에 액세스 할 수 있습니다. 이 경우 자격 증명이나 키 저장소를 저장할 필요가 없습니다. 내가 치고있는 벽은 기본 인증 토큰과 함께 요청에 대한 Authorization 헤더를 단순히 추가 한 것입니다. – user1732364

관련 문제