背景
我有两个微服务,需要访问主叫用户的IWindowsPrincipal。我正在使用.Net Core3.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是假的,身份信息是空的。
问题
是否有方法在网关中配置Ocelot,以便在必要时挑战调用方,接收Windows身份验证信息并将其传递给微服务?如果这是不可能的,是否推荐实现我的目标,在每个微服务中执行Windows身份验证?Ocelot不应该允许我在一个地方为所有的微服务处理身份验证吗?
跟进问题1
Ocelot的文档是指使用JWT进行身份验证。我是否应该得出结论,Ocelot只提供JWT配置?
跟进问题2
我读过一些关于纱线(https://microsoft.github.io/reverse-proxy/)的文章,我应该用雅普而不是奥塞洛来实现我的目标吗?
发布于 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中的场景以获得更多详细信息。
此外,我还有以下两个问题的答案:
中的相同含义
https://stackoverflow.com/questions/70045297
复制相似问题