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

我有以下架构:

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

我使用ASP.NET作为我的服务器端应用程序/ apis,用户应通过“windows integrated authentication”进行身份验证.

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

它现在与第二跳一起工作.
我的测试-WebAPIs输出用户的身份,如下所示:

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服务器(IIS)
> Server2只是安装了IIS的普通服务器.
>所有计算机都在同一个域中.

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

最佳答案 我找到了解决方案/问题.

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

《c# – Windows身份验证模拟 – 第二个请求获取错误的用户身份》

> authPersistNonNTLM
> authPersistSingleRequest

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

>连接:关闭

代替

>连接:保持活力

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

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

点赞