【发布时间】:2015-07-22 16:56:07
【问题描述】:
我有两个站点,A 和 B。 A 使用 B 公开的 API,B 需要 Windows 身份验证。这两个站点都位于D 域中。
API 通过HttpClient 使用,当站点A 在本地运行时,在我的域帐户下(在域P 中),授予访问权限。在这种情况下,HttpClient 的实例化如下:
using(var client = new HttpClient(new HttpClientHandler { UseDefaultCredentials: true }))
当A 部署到测试服务器时,上述结果会产生401 Unauthorized 响应。测试服务器上的应用程序池在域D 中的服务帐户下运行。
当像这样显式使用该服务帐户时:
var credential = new NetworkCredential("service-account", "password", "D");
var cache = new CredentialCache
{
{
new Uri(apiServerUri), "NTLM", credential
}
};
var handler = new HttpClientHandler
{
Credentials = cache
};
using(var client = new HttpClient(handler))
...
再次在本地运行站点A,仍然授予访问权限。通过浏览器直接访问 API 并指定服务帐户凭据时,也会授予访问权限。日志表明它肯定是用于访问 API 的服务帐户。
将上述内容部署回测试服务器仍会导致401 Unauthorized。
将站点 A 部署到本地 IIS 实例,也成功使用了 B 的 API。
在本地运行站点B,然后在本地通过站点A 访问它,结果是401 Unauthorized。
通过部署A 的测试服务器上的浏览器访问API,并指定服务帐户凭据,也会得到401 Unauthorized。
我不知道从哪里开始 - 我是否在代码中遗漏了一些东西来让它工作?还是可能是 IIS 或 AD 问题?
【问题讨论】:
-
闻起来像 Kerberos 问题,试试这个:blog.jimmychandra.com/post/service-principal-name-headache
-
我没有尝试进行双跳或直通身份验证 - 所以我不确定这将如何成为委托问题?它应该只是使用应用程序池标识。但我们仍然会试一试
-
那么 Web 1 和 Web2 在同一台服务器上?可能只是下意识的反应,因为我看到了服务器到服务器。假设客户端 -> 服务器 1 -> 服务器 2(如文字服务器框/服务器实例,而不仅仅是 Web 应用程序级别)...
-
这个 SO 线程可能会引起一些注意。 stackoverflow.com/questions/12212116/…
-
域之间的信任是如何建立的?选择性认证?您的本地计算机在哪个域上,P - 与您的用户帐户相同?如果它与服务器不同,那么您的计算机可能对域 D 具有“允许身份验证”权限,但域 D 中的服务帐户可能没有。
标签: c# asp.net iis windows-authentication