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();
}
}
これは、あなたが望んでいるような多くの情報を持っているようです。http://stackoverflow.com/questions/12212116/how-to-get-httpclient-to-pass-credentials-along-with-the -request –
コードをユースケースに更新した後、それでも401が受信されました。リクエストのヘッダを検査しましたが、認証ヘッダーがまだ削除されていて失敗しています。 – user1732364
Basic Authに制限されていますか?アプリケーションが実行していた同じスレッド(httpclient vs webclient)にAPI呼び出しが含まれていれば、おそらくNTLMが動作する可能性がありますか? –