4

我正在制作一个通过调用 SQL 服务器获取数据的 .Net Web API。用户通过 Windows 身份验证 (Kerberos) 进行身份验证。我希望通过委托将用户凭据传递给 SQL 服务器,但 SQL 服务器看到的是匿名用户。

这就是我所做的:

  • IIS 应用程序:启用 Windows 身份验证和 asp.net 模拟。匿名和表单身份验证已禁用。启用内核模式身份验证已选中。提供者:协商,Kerberos。使用应用程序池凭据:True。

  • 应用程序池:托管管道模式:经典。身份:网络服务。

  • 在 AD 中,运行 Web 服务器的计算机设置为“信任此计算机以委托给任何特定服务(仅限 Kerberos)”

  • 到 SQL 服务器的连接字符串包含 Integrated Security=SSPI;

  • 编辑:在我的 web.config 我有

 <system.web>
    <authentication mode="Windows" />
    <identity impersonate="true" />
  </system.web>

<security>
  <authentication>
    <windowsAuthentication enabled="true">
      <providers>
        <clear />
        <add value="Negotiate" />
        <add value="Kerberos" />
      </providers>
      <extendedProtection tokenChecking="None" />
    </windowsAuthentication>
   <anonymousAuthentication enabled="false" />
  </authentication>
</security>
  • 为机器设置了通用 HOST spn。

从浏览器中,我通过http://machinename.domain.net访问 Web 应用程序。

我希望在此设置中我的 IIS 应用程序在机器帐户下运行?

当我在 Web 服务器上的调试器中捕获请求时,我可以看到 WindowsIdentity.GetCurrent().Name 是浏览 Web 应用程序的用户的帐户,并且 WindowsIdentity.GetCurrent().AuthenticationType 设置为“Kerberos”。所以应该不错。

但是 WindowsIdentity.GetCurrent().ImpersonationLevel 仅设置为“Impersonate”。我本来希望它被设置为“代表”?

当我向 SQL 服务器发出请求时,我收到“用户 'NT AUTHORITY\ANONYMOUS LOGON' 登录失败”,因此显然用户凭据没有传递给 SQL 服务器。

我希望有人能看到我做错了什么。我真的需要朝着正确的方向前进。

4

2 回答 2

2

如果有人遇到同样的问题,供将来参考:问题是我们从 Chrome 中尝试过。它在 IE 中工作,但在 Chrome 上,需要这篇文章中提到的注册表更改:Kerberos 委托在 chrome 中不起作用

于 2015-10-28T13:25:55.527 回答
0

您应该能够在 IIS 中将身份验证设置为 ASP.NET 模拟。您可能还需要在 web.config 文件中设置以下内容,作为 <system.web> 部分的一部分。

    <identity impersonate="true" />

这可能在 <system.webServer> 部分中是必需的,但出于安全考虑并不总是建议这样做。

<validation validateIntegratedModeConfiguration="false" />
于 2015-10-12T16:49:11.070 回答