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

时间:2017-03-20 08:10:08

标签: c# asp.net windows-authentication kerberos kerberos-delegation

我有以下架构:

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

我在服务器端应用程序/ apis中使用ASP.NET,用户应通过“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
                    };
  • 我使用.NET的WebClient类。
  • 两台IIS服务器都配置了“Windows身份验证”,并配置了“协商”和“NTML”。
  • Server1是DomainController,DNS和DHCP-Server(+ IIS)
  • Server2只是安装了IIS的普通服务器。
  • 所有计算机都在同一个域中。

我无法向我解释这种行为......这对我来说毫无意义。为什么第一个传入请求的标识应该缓存在'server2'上? 如果我重新启动IIS并使用其他Windows身份标识重新执行请求,则这是“第一个工作请求”,其他人在“server2”上获取其身份。

1 个答案:

答案 0 :(得分:2)

我找到了解决方案/问题。

这实际上是一个缓存问题......缓存了第一个用户的身份。 您可以使用此“IIS设置”更改此行为:

iis settings

  • authPersistNonNTLM
  • authPersistSingleRequest

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

  • 连接:关闭

而不是

  • 连接:keep-alive

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

我希望我能用这个答案帮助其他人。