下游主机的Ocelot占位符



我有一个使用Ocelot.NET Core 3.1中运行的API网关。一切都如预期的那样顺利。

现在,我正在尝试在中间件过程中替换下游主机。

这是我的配置.json:

{
"Routes": [
{
"DownstreamPathTemplate": "/api/product/getProduct",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": "44300"
}
],
"UpstreamPathTemplate": "/getProduct"
}
],
"GlobalConfiguration": {
"BaseUrl": "https://localhost:62012/"
}
}

我想在运行时更改DownstreamHostAndPorts中的Host,因为此时从jwt中获取声明,我将知道用户所属的租户,因此知道将请求路由到哪里。

更清楚地说,网关的请求来自http://localhost:62012/api/getProduct,

然后,我从发出此调用的请求中的jwt获取租户,然后像一样将请求重定向到相关的api

http://tenant1.com/api/product/getProduct或http://tenant2.com/api/product/getProduct

您需要创建自定义中间件,并在Authentication中间件之后注入。最好的扩展点是CCD_ 9。假设您有一个通过用户声明来解决租户uri的服务,那么如下所示:

public interface ITenantHostResolver
{
Task<Uri> Resolve(ClaimsPrincipal claimsPrincipal);
}

Startup类中注入将覆盖下游设置的中间件:

public void Configure(IApplicationBuilder app)
{
var conf = new OcelotPipelineConfiguration
{
PreAuthorizationMiddleware = async (httpContext, next) =>
{
if(!httpContext.Request.Path.Equals("/api/product/getProduct"))
{
await next.Invoke();
return;
}
var claimsPrincipal = httpContext.User;
var tenantHostResolver = httpContext.RequestServices.GetRequiredService<ITenantHostResolver>();
var tenantHostAndPort = await tenantHostResolver.Resolve(claimsPrincipal);
var downstreamRequest = httpContext.Items.DownstreamRequest();
downstreamRequest.Host = tenantHostAndPort.Host;
downstreamRequest.Port = tenantHostAndPort.Port;
downstreamRequest.Scheme = tenantHostAndPort.Scheme;
await next.Invoke();
}
};
app.UseCustomOcelot(conf).Wait();
}

相关内容

  • 没有找到相关文章

最新更新