首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Ocelot在.Net核心API网关中实现IWindowsPrincipal身份验证,以便所有下游服务都可以访问IWindowsPrincipal?

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

Stack Overflow用户
提问于 2021-11-20 11:04:54
回答 1查看 666关注 0票数 1

背景

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

代码语言:javascript
运行
复制
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是假的,身份信息是空的。

问题

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

跟进问题1

Ocelot的文档是指使用JWT进行身份验证。我是否应该得出结论,Ocelot只提供JWT配置?

跟进问题2

我读过一些关于纱线(https://microsoft.github.io/reverse-proxy/)的文章,我应该用雅普而不是奥塞洛来实现我的目标吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-21 17:22:36

我想答案是No

是否有在网关中配置Ocelot的方法,以便在必要时挑战调用方,接收Windows身份验证信息并将其传递给微服务?

问题是Windows身份验证是有状态的,服务器和客户端在同一个Active 中,您可以在.NET核心Windows身份验证中找到说明

Windows身份验证是一种有状态场景,主要用于intranet,其中代理或负载均衡器通常不处理客户端和服务器之间的通信。

Microservices体系结构需要无状态状态(意味着服务器和客户端位于不同的AD/OS/Network中)。网关是微服务图片中的一个无状态组件。

OIDC使用(ADFS)和OpenID连接(OIDC),或者自己在IIS中构建身份服务器( Identity Server ),这是Ocelot对OpenID用户进行身份验证的唯一方法。您可以阅读ADFS或Azure AD中的场景以获得更多详细信息。

此外,我还有以下两个问题的答案:

  1. No,Ocelot只是提供了外接程序特性,以检测在允许请求通过下游之前必须包含哪些JWT声明。您可以构建自定义身份验证/授权中间件,以允许/拒绝正确的upstream.
  2. No,YARP在requirement.

中的相同含义

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70045297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档