【问题标题】:ASP.NET Authentication Issues on IIS7 - User.Identity.Name is empty for Windows authenticationIIS7 上的 ASP.NET 身份验证问题 - 对于 Windows 身份验证,User.Identity.Name 为空
【发布时间】:2011-09-28 22:36:11
【问题描述】:

我们在 ASP.NET 4.0 上有一个使用 MVC 3 的 ASP.NET 应用程序,它使用 Windows 身份验证。

当从 Visual Studio 2010 运行时,一切都按预期工作,但当推出到 IIS7 时,Windows 登录用户永远不会被填充(检查 User.Identity.Name)。也不会出现用户凭据的对话框提示。

web.config 设置:

<authentication mode="Windows" />

在 IIS 中,我可以看到 Windows 身份验证已启用,匿名也是如此(禁用匿名会导致 403 Forbidden 并且不显示任何内容)。

我已尝试启用和禁用“内核模式身份验证”(useKernelMode="true"),但这似乎没有任何区别。虽然我确实记得我们必须在不同服务器上的另一个站点上禁用此设置才能使身份验证正常工作(可能指向堆栈更底层的潜在问题?)。

如果有用的话,来自 IIS 的 applicationHost.config:

<security>
  <authentication>
    <anonymousAuthentication enabled="true" />
    <digestAuthentication enabled="false" />
    <basicAuthentication enabled="false" />
    <windowsAuthentication enabled="true" useKernelMode="false">
      <providers>
        <clear />
        <add value="NTLM" />
      </providers>
    </windowsAuthentication>
  </authentication>
</security>

任何想法可能是什么问题?

提前感谢您的任何建议。

更新 1

我设法找到另一个 IIS7 服务器进行测试,我发现如果我禁用匿名访问,一切都按预期工作。但是,即使我也禁用了匿名访问,我仍然在原始 IIS7 服务器上遇到问题(我现在一直禁用匿名)。所以我猜在堆栈的下方肯定有一些问题。有任何想法吗?我需要修复一些东西,因为我想它会不断弹出并咬我们。

更新 2

如果我在问题 IIS7 框中启用摘要式身份验证,那么我会遇到登录提示对话框的挑战,如果我提供合适的凭据,一切都会按预期工作。但是作为一个用户已经登录到域的内部网络应用程序,我们真的不想以这种方式挑战他们。凭据应该透明地传递,因为它适用于第二个 IIS7 框。

更新 3

一些进展...我发现如果 Web 应用程序位于根目录而不是子站点中,则直接编辑 IIS7 的 applicationHost.config 文件以提供以下身份验证设置允许站点按预期工作:

<authentication>
  <anonymousAuthentication enabled="false" />
  <windowsAuthentication enabled="true">
    <providers>
      <clear />
      <add value="NTLM" />
    </providers>
  </windowsAuthentication>
  <digestAuthentication enabled="false" />
</authentication>

使用 IIS7 的 UI 来配置身份验证并不能给出完全正确的结果。身份验证项目要么在病房后丢失(因为我猜 IIS7 假设它们被继承)要么它们的设置错误(windowsAuthentication 似乎需要上面的提供程序配置才能正常工作)。

不幸的是,有问题的 Web 应用程序实际上是一个子应用程序,因为有一个内部版本(使用 Windows 身份验证 > www.site.com/internal)和一个外部版本(使用表单身份验证 > www.site.com/external)。我仍然无法让身份验证作为子应用程序工作。我只是得到一个“错误代码:403 Forbidden”。

【问题讨论】:

  • 你用什么浏览器测试?如果是 Firefox,您可能需要查看:addons.mozilla.org/en-US/firefox/addon/… Firefox 没有开箱即用地正确“启用”Windows 身份验证。
  • 干杯大卫,但没有任何帮助。这个人似乎在让 Windows 身份验证工作时遇到问题,因为他错过了 web.config 设置(因此无法在 VS 或 IIS 中工作)。在 VS 中一切正常,只是 IIS 没有按预期运行。
  • 谢谢克里斯。我已经在 IE、Firefox 和 Chrome 中尝试过。从 VS 运行时一切正常,但在 IIS 上运行时不行。我认为我在 IIS 上遗漏了一些东西,或者堆栈中存在问题,因为理论上它应该很容易设置。
  • @Gavin 你找到问题了吗?

标签: asp.net asp.net-mvc-3 iis-7 windows-authentication


【解决方案1】:

在这种情况下,这是一个 Microsoft ISA Server 问题。似乎请求是通过 ISA 内部路由的 Windows Authenticated 站点,一旦 ISA 被删除,问题就消失了。

我不太了解 ISA 以及它如何路由请求,但我认为它一定是从请求中删除了一些重要信息,因为有人会配置一些规则。

作为一个旁注,以防它有助于诊断类似的设置:网络管理员告诉我,内部流量不是通过 ISA 路由的,但在内部 ping 网站表明 ISA 实际上在起作用。

【讨论】:

  • 这就是你的工作方式吗?我对这到底意味着什么感到困惑。
  • @DanielJackson 抱歉,我的记忆不能很好地追溯到 6 年前 ;)
  • 没问题。不管怎么说,多谢拉。我正在使用.Net Core,但仍然足够相似。我的问题是添加forwardWindowsAuthToken="true",这是微软声称默认情况下正确但没有此属性的用户身份属性为空。
【解决方案2】:

您提到禁用匿名访问在另一台服务器上有效,但在您的主服务器上遇到 403 错误。因此,我会检查您的网站运行所在文件夹的基于文件的权限。在过去,我需要授予 \Network Serivce 帐户对站点文件夹和所有子文件夹的完全控制权,否则我会遇到 403 错误。检查正在工作的服务器上的文件权限,看看是否与不工作的服务器有差异。

另外,如果这不是问题,我建议比较两台服务器之间的所有其他 IIS 设置,因为您知道它适用于一台服务器,而不适用于另一台服务器。找出差异。

【讨论】:

  • 感谢佩奇,但仍然不高兴。网络服务对文件夹具有完全权限,并且也由应用程序池使用。我正在比较服务器,但到目前为止没有明显差异。我想知道这是否与不同盒子的 AD 配置不同有关。将追踪运营团队的一名成员以尝试进一步调查。
  • @Gavin,您需要检查应用程序池身份的权限,该身份不需要是网络服务。
  • @VinayC - 干杯。在这种情况下,应用程序池正在使用网络服务网络服务也具有文件位置的完全权限。
猜你喜欢
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多