我想知道是否在.NET中,是否可以通过IIS中运行应用程序池的身份凭证发送到使用Basic Auth的API。我已经成功地从应用程序池中检索了身份上下文。但是,在我看到的使用Basic Auth的每个例子中。他们似乎都需要手动将Authorization标头添加到请求中。这是一个问题,因为我不能直接访问Windows身份的密码,因此我无法手动创建基本身份验证令牌。我一直在尝试使用.DefaultCredentials属性,但它无法生成Auth标头,因此响应失败了401.如果这不可能,那么我将采取不同的方法,但我想确保在我这样做之前。完整的代码示例如下......我已经尝试了多种方式,但最终都得到了相同的401。
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 :(得分:0)
App Pool Identity和Basic Auth有两个不同的目的,我建议不要混用它们。正如您还提到的,您不知道应用程序池标识的密码,并且它是自我解释的。应用程序池标识还允许API访问系统资源,例如访问文件共享。
而基本身份验证允许您保护您的API整体不被公开以及任何人访问它。除了知道UserName:Password的人需要与每个HttpRequest一起传递(包含带有UserName的HttpHeader:Base64中的密码)。
考虑到这些事实,当API开发人员需要与所有各方共享UserName和Password时,建议不要共享App Pool Identity凭据。
我使用过App Pool Identity和Basic Auth,我建议将它们分开。