【问题标题】:Why is Windows Authentication working from local to server, but not server to server?为什么 Windows 身份验证是从本地到服务器,而不是从服务器到服务器?
【发布时间】:2015-07-22 16:56:07
【问题描述】:

我有两个站点,ABA 使用 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


【解决方案1】:

虽然我还没有确切地确定为什么这种解决方法有效,或者是否有一种更好的方法(因为这感觉很笨重),以下是允许A 连接到B,而两者都位于同一台服务器上。

站点 B 在 IIS 中设置了额外的主机绑定,以侦听 localhost:12345。站点A 已配置为连接到该端点,而不是站点B 的域名。身份验证现在工作正常。

如果有人能解释为什么会这样,我会很感兴趣 - 我不喜欢“魔法”修复。

编辑 this kb article 似乎是导致此行为的可能原因。具体来说:

当您使用完全限定域名 (FQDN) 或自定义主机时 标头浏览托管在计算机上的本地 Web 站点 运行 Microsoft Internet Information Services (IIS) 5.1 或更高版本 版本,您可能会收到类似于 以下:HTTP 401.1 - 未经授权:登录失败出现此问题 当网站使用集成身份验证并具有 映射到本地环回地址

因此,如果您使用的 FQDN 或自定义主机标头与本地计算机名称不匹配,则身份验证将失败。

注册表修改在这些服务器上并不是一个真正的选项,所以看起来我们将使用解决方法。

【讨论】:

    猜你喜欢
    • 2016-05-16
    • 2019-07-23
    • 2022-09-27
    • 2022-11-30
    • 2020-11-24
    • 2014-01-31
    • 2012-11-07
    • 2017-08-15
    • 1970-01-01
    相关资源
    最近更新 更多