2017-05-01 11 views
0

IISでアプリケーションプールを実行しているIDの資格情報を基本認証を使用するAPIに送信できるかどうかは、.NETで不思議です。私は正常にアプリケーションプールからアイデンティティコンテキストを取得することができました。しかし、すべての例で私は基本認証を使用して参照してください。彼らはすべて要求にAuthorizationヘッダーを手動で追加する必要があるようです。これは、私は直接Windows認証のパスワードにアクセスすることはできませんので、私は手動で基本認証トークンを作成することはできませんので、問題です。 .DefaultCredentialsプロパティを使用しようとしていますが、Authヘッダーを生成できないため、401で応答が失敗します。これができない場合は、別のアプローチをとるでしょうが、そうする前に確認しています。完全なコードサンプルiは、複数の方法を試してみましたが、すべてが同じ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

Basic Authに制限されていますか?アプリケーションが実行していた同じスレッド(httpclient vs webclient)にAPI呼び出しが含まれていれば、おそらくNTLMが動作する可能性がありますか? –

答えて

0

アプリケーションプールIDと基本認証は、2つの異なる目的を果たすで終わると私はそれらを混在しないようお勧め...以下の通りです。あなたはまた、あなたがアプリケーションプールのアイデンティティのパスワードを知らないとそれは自明だと述べたように。アプリケーションプール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

関連する問題