Windows 身份验证模拟 - 第二个请求获得错误的用户身份

Windows Authentication Impersonation - Second request gets wrong user identity

我有以下架构:

Client1(Browser-App) -> Server1 (WebAPI/IIS) -> Server2 (WebAPI/IIS)

我正在为我的服务器端使用 ASP.NET applications/apis 并且用户应该通过 "windows integrated authentication".

进行身份验证

如您所见,从 server1 到 server2 有第二个跃点。如果两个 WebAPI 不在同一台服务器上,则 NTML 不支持第二个跃点。 所以我配置了一个AD域来支持"kerberos".

现在可以在第二个跃点上使用了。 我的测试 WebAPI 像这样输出用户的身份:

server1: test.domain/user1
server2: test.domain/user1

但是如果我更改 Client1 上的登录用户并执行与 "otherUser2" 相同的请求,只有第一跳获得正确的身份:

server1: test.domain/otherUser2
server2: test.domain/user1

在第二个跃点上显示第一个请求的旧用户。 我测试了多个场景:如果以下请求来自另一个客户端和另一个 windows 用户...

,则行为相同

看起来第一个请求的 windows 身份缓存在 server2 上...这对我来说是个大问题,我认为这不应该是可能的...这是一个很大的安全漏洞如果请求在错误的用户上下文中执行!

这是一个已知问题吗?我做错什么了吗? 有解决办法或者更好的配置吗?

在第一个 ASP.NET WebAPI 上,我使用这样的模拟:

WindowsIdentity identity = (WindowsIdentity)HttpContext.Current.User.Identity;

            using (var wic = identity.Impersonate())
            {
                try
                {
                    WebClient c = new WebClient
                    {
                        UseDefaultCredentials = true
                    };

我无法解释这种行为...这对我来说毫无意义。为什么第一个传入请求的身份应该缓存在 'server2' 上? 如果我重新启动 IIS 并使用另一个 windows 身份重新执行请求,则这是 "first working request" 并且其他人在 'server2'.

上获得他的身份

我找到了solution/problem。

实际上是缓存问题...缓存了第一个用户的身份。 您可以使用 "IIS settings":

更改此行为

  • authPersistNonNTLM
  • authPersistSingleRequest

或者您在 API1 的 HTTP 客户端可以禁用 TCP 连接缓存:

  • 连接:关闭

而不是

  • 连接:保持活动状态

但我的场景中的实际问题是 fiddler(一个 HTTP 代理工具)。 我在 API1 的 web.config 中将 fiddler 配置为代理。这使连接保持打开状态并重用了第一个身份...

我希望我能帮助其他人回答这个问题。