C# 如何将Windows身份验证凭据从客户端传递到Web API服务

C# 如何将Windows身份验证凭据从客户端传递到Web API服务,c#,asp.net,authentication,windows-authentication,asp.net-web-api,C#,Asp.net,Authentication,Windows Authentication,Asp.net Web Api,在我的公司环境中,我有IIS7.5托管一个Web API服务和一个单独的网站,该网站通过RestSharp库调用该服务。两者当前都配置了Windows身份验证 如果我使用浏览器导航到其中一个,系统会提示我输入我的windows凭据,一切都很正常。。。我得到了我想要的网页,而REST服务会吐出我的数据。我正在努力弄清楚的部分是如何使用一个凭证对两者进行身份验证。我不知道如何将网站的凭据传递给服务(我尝试了模拟,但没有成功),或者手动提示用户输入用户名/密码,然后使用“Windows”对其进行身份验

在我的公司环境中,我有IIS7.5托管一个Web API服务和一个单独的网站,该网站通过RestSharp库调用该服务。两者当前都配置了Windows身份验证

如果我使用浏览器导航到其中一个,系统会提示我输入我的windows凭据,一切都很正常。。。我得到了我想要的网页,而REST服务会吐出我的数据。我正在努力弄清楚的部分是如何使用一个凭证对两者进行身份验证。我不知道如何将网站的凭据传递给服务(我尝试了模拟,但没有成功),或者手动提示用户输入用户名/密码,然后使用“Windows”对其进行身份验证


帮助noob摆脱困境?

如果您在网站上使用模拟,并且API运行在同一台服务器上,那么它应该可以工作


但是,如果将API从站点移动到其他服务器,则会停止工作。双服务器设置需要Kerberos委派。

web API的设置

  • 启用Windows身份验证
  • web应用程序的设置

  • 启用Windows身份验证
  • 在web.config的
    中添加
  • 在web.config中添加以下内容:

     <system.webServer>
         <validation validateIntegratedModeConfiguration="false" />
     </system.webServer>
    

    注意:如果您仍然收到401个错误,您可能需要在URL中使用IP地址而不是常规域名(例如:155.100.100.10而不是mycompany.com)

    谢谢,@Anders。该站点和API在不同的站点上运行。我将看一看kerberos。我想警告您,kerberos委托是非常重要的。我还没有找到一个IT部门知道如何做或愿意尝试。解决方法是使用一个服务帐户,该帐户可以访问站点在向服务器调用API服务器时可以使用的所有内容。这不是最漂亮的解决方案,它要求您签入代码,以确保登录到web站点的用户不会从API中获得比预期更多的信息。但至少它是一个工作选项,不需要对it环境进行大量侵入性更改。
    using (var client = new WebClient { UseDefaultCredentials = true })
    {
        client.Headers.Add(HttpRequestHeader.ContentType, "application/xml; charset=utf-8");
        byte[] responseArray = client.UploadData("URL of web API", "POST", Encoding.UTF8.GetBytes(XMLText));
        string response = Encoding.ASCII.GetString(responseArray);
    }