如何使用 Ocelot 在 .Net Core API 網關中實現 Windows 身份驗證,以便所有下游服務都可以訪問 IWindowsPrincipal?

大衛·薩克斯坦

背景

我有兩個微服務需要訪問調用用戶的 IWindowsPrincipal。我正在使用 .Net Core 3.1 編寫一個 API 網關,它將充當這些服務的反向代理。我在 API Gateway 中配置了身份驗證和授權,如下所示:

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 來實現我的目標嗎?

約翰·勒

我以為答案是否定的

有沒有辦法在網關中配置 Ocelot,以便它在必要時挑戰調用者接收 Windows 身份驗證信息並將其傳遞給微服務?

問題是Windows 身份驗證是有狀態的,服務器和客戶端在同一個 Active Directory 中,您可以在 .NET Core Windows 身份驗證中找到註釋

Windows 身份驗證是一種主要用於 Intranet 的有狀態方案,其中代理或負載平衡器通常不處理客戶端和服務器之間的流量。

微服務架構需要無狀態而非有狀態(意味著服務器和客戶端在不同的 AD/OS/網絡中)。網關是微服務圖中的無狀態組件。

Ocelot 可以對 Windows 用戶進行身份驗證的唯一方法是使用 Active Directory 聯合服務 (ADFS) 和 OpenID Connect (OIDC) 或自己在 IIS 服務器中構建身份服務器您可以閱讀 ADFS 或 Azure AD 中的方案以了解更多詳細信息。

此外,還有我對以下兩個問題的回答:

  1. ,Ocelot 只是提供插件功能來檢測必須包含 JWT 的哪些聲明,然後才能允許請求通過下游。您可以構建自定義身份驗證/授權中間件以允許/拒絕正確的上游。
  2. ,在您的要求中,YARP 與 Ocelot 的含義相同。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章