我有以下架构:
Client1(Browser-App) -> Server1 (WebAPI/IIS) -> Server2 (WebAPI/IIS)
我正在为我的服务器端应用程序/api 使用 ASP.NET,并且应该通过“Windows 集成身份验证”对用户进行身份验证。
如您所见,从 server1 到 server2 有第二个跃点。如果两个 WebAPI 不在同一台服务器上,NTML 不支持第二个跃点。所以我配置了一个 AD 域来支持“kerberos”。
它现在适用于第二跳。我的 test-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 服务器都配置了“协商”和“NTML”的“Windows 身份验证”。
- Server1 是域控制器、DNS 和 DHCP 服务器 (+IIS)
- Server2 只是安装了 IIS 的普通服务器。
- 所有计算机都在同一个域中。
我无法向我解释这种行为......这对我来说毫无意义。为什么第一个传入请求的身份应该缓存在“server2”上?如果我重新启动 IIS 并使用另一个 Windows 身份重新执行请求,这是“第一个工作请求”,其他人在“server2”上获得他的身份。