C# 401在Web API中发出WebClient请求时

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

我希望有人能帮我,因为我已经不知所措了

我有一个简单的Web API Web服务,它检查文档管理系统上是否存在工作区,以确定安全访问

当我在浏览器中运行此服务时,它工作正常。然而,当我尝试在另一个Web API应用程序中使用该服务时,它给出了一个401

我已经尝试了几乎所有我能想到的和能在这里找到的东西。它使用Windows身份验证,无论我尝试什么,NTLM、协商或协商:Kerberos,都不会传递当前用户的凭据。如果我硬编码我的用户ID、密码和域,不管它如何工作。代码如下

    [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调用中使用上下文呢?