我们正在使用相同的微服务方法,并通过覆盖标准的 ocelot 身份验证中间件来解决它。
在配置部分的启动(.net core)中,我们实现它如下:
public async void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
OcelotPipelineConfiguration ocelotConfig = new OcelotPipelineConfiguration
{
AuthenticationMiddleware = async (ctx, next) =>
{
try
{
AuthenticationClient.Authenticate(Configuration, ctx.HttpContext, new List<string>());
IEnumerable<string> allowedRoles = ctx.DownstreamReRoute.RouteClaimsRequirement.Select(e => e.Value).ToList();
if(allowedRoles != null && allowedRoles.Count() > 0)
{
string userId= AuthenticationClient.Authenticate(Configuration, ctx.HttpContext, allowedRoles);
ctx.DownstreamReRoute.AddHeadersToDownstream.Add(new AddHeader("userId", userId));
}
}catch(ApiGateway.Core.Exceptions.ForbiddenException e)
{
ctx.Errors.Add(new ApiGateway.WebApi.Exceptions.ForbiddenException(e.Message, Ocelot.Errors.OcelotErrorCode.UnauthorizedError));
}
catch(Exception e)
{
ctx.Errors.Add(new UnauthenticatedError(e.Message));
}
await next.Invoke();
},
AuthorisationMiddleware = async (ctx, next) =>
{
await next.Invoke();
}
};
解释:
首先,用户使用bearer-jwt-token
http-Header 中的(或 Basic)进行身份验证。
然后从 Ocelot-Settings (Section ) 中读取允许的角色/权限(我们将活动目录组作为角色RouteClaimsRequirement
)。
如果用户具有允许的角色/权限之一,我们将获取 userId 并将其添加到转发到相应服务的 http-request 标头中。因此,目标服务了解用户。
To me, it also sounds kind of insecure to only authenticate the reroutes,
通常微服务本身不能直接访问,并且部署在后面的服务器层。只允许 API-Gateway 访问它们。优点是,您的微服务不需要关心身份验证、授权等。
希望它能澄清你的问题。