如何使用 Ocelot 在 .Net Core API 网关中实现 Windows 身份验证,以便所有下游服务都可以访问 IWindowsPrincipal?

How to implement Windows Authentication in a .Net Core API Gateway using Ocelot so that all downstream services can access IWindowsPrincipal?

背景

我有两个微服务需要访问调用用户的 IWindowsPrincipal。 我正在使用 .Net Core 3.1 编写一个 API 网关,它将充当这些服务的反向代理。 我在 API 网关中配置了身份验证和授权,如下所示:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
    {
        options.AddPolicy("All allowed",
            builder =>
            {
                builder
                    .AllowAnyOrigin()
                    .AllowAnyMethod()
                    .AllowAnyHeader();
            });
    });

    services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
        .AddNegotiate();
    services.AddAuthorization();

    services.AddControllers();
    services.AddHttpForwarder();
    services.AddOcelot();
    services.AddSwaggerForOcelot(_configuration);
}

public void Configure(IApplicationBuilder app)
{
    app.UseCors("All allowed");

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });

    app.UseSwaggerForOcelotUI(options =>
    {
        options.PathToSwaggerGenerator = "/swagger/docs";
    });

    app.UseOcelot();
}

要求

我想使用 HttpContext.User.Identity 访问主叫用户的身份 在微服务的方法中。

实际结果

微服务方法中HttpContext.User.Identity.IsAuthenticated为false,身份信息为空

问题

有没有办法在网关中配置 Ocelot,以便在必要时挑战调用者接收 Windows 身份验证信息并将其传递给微服务? 如果这是不可能的,推荐的方法是实现我的目标,在每个微服务中执行实施 Windows 身份验证吗? Ocelot 难道不应该允许我在一个地方为所有微服务处理身份验证吗?

按照问题 1

Ocelot 的文档提到使用 JWT 进行身份验证。 我是否应该断定 Ocelot 只提供 JWT 配置?

继续问题 2

我已经阅读了一些关于 Yarp 的内容 (https://microsoft.github.io/reverse-proxy/) 我应该使用 Yarp 而不是 Ocelot 来实现我的目标吗?

我认为答案是

Is there a way to configure Ocelot in the gateway so that it will Challenge the caller if necessary receive Windows Authentication information and pass it on to the microservices?

问题是Windows身份验证是有状态的,服务器和客户端在同一个Active Directory中,你可以在.NET Core中找到注释Windows 认证

Windows Authentication is a stateful scenario primarily used in an intranet, where a proxy or load balancer doesn't usually handle traffic between clients and servers.

微服务架构需要无状态而不是有状态(意味着服务器和客户端处于不同的 AD/OS/Network)。而Gateway是微服务图中的一个无状态组件。

Ocelot 可以进行身份​​验证的唯一方法Windows用户正在使用 Active Directory Federated Services (ADFS) 和 OpenID Connect (OIDC) 或自己在 IIS 服务器中构建身份服务器.您可以阅读 ADFS 或 Azure AD 中的场景以获取更多详细信息。

另外,还有我对以下两个问题的回答:

  1. 没有,Ocelot只是提供了插件功能来检测在允许请求通过下游之前必须包含哪些JWT声明。您可以将自定义 Authentication/Authorization 中间件构建到 allow/deny 正确的上游。
  2. ,YARP和你要求的Ocelot是同一个意思