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