如何将 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 Authentication
和 ASP.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 服务的主要内容,如果未能解决你的问题,请参考以下文章
如何将 JWT 从客户端传递到我的 API 以进行正确身份验证?