C# 401在Web API中发出WebClient请求时
我希望有人能帮我,因为我已经不知所措了 我有一个简单的Web API Web服务,它检查文档管理系统上是否存在工作区,以确定安全访问 当我在浏览器中运行此服务时,它工作正常。然而,当我尝试在另一个Web API应用程序中使用该服务时,它给出了一个401 我已经尝试了几乎所有我能想到的和能在这里找到的东西。它使用Windows身份验证,无论我尝试什么,NTLM、协商或协商:Kerberos,都不会传递当前用户的凭据。如果我硬编码我的用户ID、密码和域,不管它如何工作。代码如下C# 401在Web API中发出WebClient请求时,c#,asp.net-web-api,C#,Asp.net Web Api,我希望有人能帮我,因为我已经不知所措了 我有一个简单的Web API Web服务,它检查文档管理系统上是否存在工作区,以确定安全访问 当我在浏览器中运行此服务时,它工作正常。然而,当我尝试在另一个Web API应用程序中使用该服务时,它给出了一个401 我已经尝试了几乎所有我能想到的和能在这里找到的东西。它使用Windows身份验证,无论我尝试什么,NTLM、协商或协商:Kerberos,都不会传递当前用户的凭据。如果我硬编码我的用户ID、密码和域,不管它如何工作。代码如下 [HttpG
[HttpGet]
[Route("api/Session/CheckSecurity")]
public HttpResponseMessage CheckSecurity(string id)
{
WebClient client;
WindowsIdentity userId;
string result;
try
{
userId = (WindowsIdentity)User.Identity;
using (WindowsImpersonationContext context = userId.Impersonate())
{
client = new System.Net.WebClient() { UseDefaultCredentials = true };
client.Headers.Add("content-type", "application/json");
result = client.DownloadString(new Uri(String.Format(ConfigurationManager.AppSettings["Url"], id)));
return new HttpResponseMessage(HttpStatusCode.OK);
}
}
catch (WebException webExcp)
{
HttpWebResponse resp = (HttpWebResponse)webExcp.Response;
resp.Headers.Remove("WWW-Authenticate");
// return 403 instead of 401 to prevent security pop up
return new HttpResponseMessage(resp.StatusCode == HttpStatusCode.Unauthorized ? HttpStatusCode.Forbidden : resp.StatusCode);
}
catch (Exception ex)
{
return new HttpResponseMessage(HttpStatusCode.InternalServerError);
}
}
因此,在尝试了2天我能想到的一切并在谷歌搜索中大发雷霆之后,我遇到了一个完全无关的问题,即使用代理可能导致身份验证问题 这引发了一场啊哈!那个一刻,我关掉了小提琴。瞧,一切都按预期的那样运转
我不确定为什么会发生这种情况,但我将与Fiddler一起玩一玩,看看是否可以在将来阻止这种情况发生。您创建了
上下文
对象,但不在网络客户端中使用它,这是故意的吗?我的理解是,上下文触发了请求用户而不是应用程序池用户的模拟,UseDefaultCredentials将接收到这一点。如果这是错误的,那么我将如何在WebRequest调用中使用上下文呢?