Asp.net 委托

Posted

技术标签:

【中文标题】Asp.net 委托【英文标题】:Asp.net delegation 【发布时间】:2015-10-12 16:42:15 【问题描述】:

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

这就是我所做的:

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 访问网络应用程序。

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

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

但是,WindowsIdentity.GetCurrent().ImpersonationLevel 仅设置为“Impersonate”。我原以为它会设置为“委托”?

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

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

【问题讨论】:

我们有一个通过 Windows Server 12 运行 IIS 8.x 的 Web 服务器,我们的 DC 位于 Server 2008 R2 上。此外,我们的 Intranet Web 应用程序通过appname.domain2.com 访问(而我们的域实际上是 domain1)。因此,设置与本文中提到的设置并不完全相同。以下是我们为使委托发挥作用而采取的其他步骤: appname.domain2.com 需要添加到 Intranet 区域,并且需要为 Web 服务器机器设置 appname.domain2.com 的 HTTP 和 HOST SPN。此外,在 AD 中,我们允许 Web 服务器计算机专门为 MSSQLSvc 进行委派,该服务是通过运行 SQL Server 的服务帐户访问的。最后,虽然我们通过 Web 服务器上的 IIS 管理创建了相同的配置,但没有使用上面列出的 web.config 的 部分。 【参考方案1】:

如果有人遇到同样的问题,供将来参考: 问题是我们从 Chrome 中尝试过。它可以在 IE 中运行,但在 Chrome 上,需要更改本文中提到的注册表:Kerberos delegation doesn't work in chrome

【讨论】:

在 Firefox 上,授权所需的更改在这篇文章中提到:developer.mozilla.org/en-US/docs/Mozill/…【参考方案2】:

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

    <identity impersonate="true" />

部分可能需要这样做,但出于安全考虑并不总是建议这样做。

<validation validateIntegratedModeConfiguration="false" />

【讨论】:

我的 web.config 中有 ,抱歉,我忘记在第一篇文章中添加了。当我以经典模式运行站点时,我认为我不需要 。据我了解,只有在集成模式下运行时才需要这个?我应该这样做吗? 为了使用直通身份验证,您需要模拟和 Windows 身份验证。除非您按上述方式关闭验证,否则有一项安全功能不允许直通。搜索pass-thru authentication,你会找到类似的答案。 感谢您的评论。我尝试添加 但不幸的是,无论我以集成模式还是经典模式运行应用程序池,它都会给出完全相同的结果。 好的。我对内核模式进行了一些研究,并认为此链接可能会帮助您了解一些事情。抱歉,以上内容对您不起作用。我在几个使用 IIS7 的 Web 应用程序上使用了此配置,并且每次都有效,所以我猜测还有另一个问题。 blogs.msdn.com/b/amol/archive/2010/10/29/…

以上是关于Asp.net 委托的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core管道详解[4]: 中间件委托链

ASP.NET Core中间件计算Http请求时间

[netcore] ASP.NET Core 中间件

[netcore] ASP.NET Core 中间件

ASP.NET AJAX Function.createDelegate vs Function.createCallback?

ASP.NET Core 3.1--中间件源码解读--RequestDelegate--ApplicationBuilder.Use