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
};
- 我使用.NET的WebClientclass
- 两个 IIS 服务器都配置了 "Windows Authentication" "Negotiation" 和 "NTML"。
- Server1 是域控制器、DNS 和 DHCP 服务器 (+IIS)
- Server2只是安装了IIS的普通服务器。
- 所有计算机都在同一个域中。
我无法解释这种行为...这对我来说毫无意义。为什么第一个传入请求的身份应该缓存在 'server2' 上?
如果我重新启动 IIS 并使用另一个 windows 身份重新执行请求,则这是 "first working request" 并且其他人在 'server2'.
上获得他的身份
我找到了solution/problem。
实际上是缓存问题...缓存了第一个用户的身份。
您可以使用 "IIS settings":
更改此行为
- authPersistNonNTLM
- authPersistSingleRequest
或者您在 API1 的 HTTP 客户端可以禁用 TCP 连接缓存:
- 连接:关闭
而不是
- 连接:保持活动状态
但我的场景中的实际问题是 fiddler(一个 HTTP 代理工具)。
我在 API1 的 web.config 中将 fiddler 配置为代理。这使连接保持打开状态并重用了第一个身份...
我希望我能帮助其他人回答这个问题。
我有以下架构:
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
};
- 我使用.NET的WebClientclass
- 两个 IIS 服务器都配置了 "Windows Authentication" "Negotiation" 和 "NTML"。
- Server1 是域控制器、DNS 和 DHCP 服务器 (+IIS)
- Server2只是安装了IIS的普通服务器。
- 所有计算机都在同一个域中。
我无法解释这种行为...这对我来说毫无意义。为什么第一个传入请求的身份应该缓存在 'server2' 上? 如果我重新启动 IIS 并使用另一个 windows 身份重新执行请求,则这是 "first working request" 并且其他人在 'server2'.
上获得他的身份我找到了solution/problem。
实际上是缓存问题...缓存了第一个用户的身份。 您可以使用 "IIS settings":
更改此行为- authPersistNonNTLM
- authPersistSingleRequest
或者您在 API1 的 HTTP 客户端可以禁用 TCP 连接缓存:
- 连接:关闭
而不是
- 连接:保持活动状态
但我的场景中的实际问题是 fiddler(一个 HTTP 代理工具)。 我在 API1 的 web.config 中将 fiddler 配置为代理。这使连接保持打开状态并重用了第一个身份...
我希望我能帮助其他人回答这个问题。