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

Posted

技术标签:

【中文标题】如何将 Windows 身份验证凭据从客户端传递到 Web API 服务【英文标题】:How to pass Windows Authentication credential from client to Web API service 【发布时间】:2014-12-13 08:00:37 【问题描述】:

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

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

帮助一个菜鸟?

【问题讨论】:

【参考方案1】:

网络 API 设置

    启用Windows Authentication

网络应用设置

    启用Windows Authentication 在 web.config 的 <system.web> 中添加 <identity impersonate="true" />

    在 web.config 中添加以下内容:

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

    在 IIS 中启用 Windows AuthenticationASP.NET Impersonation

您可以使用以下代码将数据 POST 到 Web API(当然也可以使用 GET)

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);

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

【讨论】:

【参考方案2】:

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

http://msdn.microsoft.com/en-us/library/aa292118(v=vs.71).aspx

但是,如果您将 API 移动到与站点不同的服务器上,这将停止工作。两台服务器设置需要 Kerberos 委派。

【讨论】:

谢谢,@Anders。该站点和 API 在不同的站点上运行。我来看看kerberos。 我想警告您,Kerberos 委派是不平凡的。我还没有找到一个知道如何做或愿意尝试的 IT 部门。一种解决方法是使用可以访问站点在调用 API 服务器到服务器时可以使用的所有内容的服务帐户。这不是最漂亮的解决方案,它要求您签入代码,以使登录到网站的用户不会从 API 获得比他或她应该得到的更多信息。但至少它是一个可行的选择,不需要对 IT 环境进行大量侵入性更改。

以上是关于如何将 Windows 身份验证凭据从客户端传递到 Web API 服务的主要内容,如果未能解决你的问题,请参考以下文章

通过 REST API 传递“Windows 身份验证”?

如何将 JWT 从客户端传递到我的 API 以进行正确身份验证?

如何对 WCF 数据服务进行身份验证?

如何在 asp.net 中使用 Windows 身份验证获取用户名?

如何将用户凭据传递给 Web 服务?

如何使用 SAML 对 Windows 窗体客户端进行身份验证?