我正在努力学习并研究如何将我当前的asp.net api拆分成一组较小的api,以尝试制作一个微服务应用程序(主要是为了学习目的)。我正在使用Ocelot作为网关,我发现Ocelot很好,很容易设置。但是,我发现很难找到适当的文档,例如,如何添加身份验证,因为ocelot.readthedocs.io在这方面感到恐惧。我很难弄清楚我是否应该在我的网关api中创建我的注册和登录方法,还是将其保留在保存用户数据库的微服务中?也许我应该将我的网关api连接到用户数据库,以便进行直接的交互?(感觉它似乎违背了微型服务的目的)。
在我看来,只对重路由进行身份验证听起来还有点不安全,与在单块应用程序中对http方法进行身份验证相比。但我可能忽略了整件事。否则,如果你们知道任何很好的信息来源,那就太好了,因为我很难为ocelot和asp.net微服务找到艺术品、教程、课程或任何类似性质的东西。
发布于 2020-03-12 06:39:32
我们正在做同样的微服务方法,我们通过覆盖标准的ocelot身份验证中间件来解决它。
在启动(.net核心)的配置部分中,我们将其实现如下:
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 (或Basic)从http-头进行身份验证。
然后从Ocelot(RouteClaimsRequirement部分)读取允许的角色/权限(我们将活动目录组作为角色)。
如果用户有一个允许的角色/权限,我们将获得userId并将其添加到转发到相应服务的http-请求头中。因此,目标服务了解用户。
To me, it also sounds kind of insecure to only authenticate the reroutes,
通常,微服务本身不能直接访问,而是部署在后面的服务器层。只有才允许访问它们.优点是,您的微服务不需要关心身份验证、授权等。
希望它能澄清你的疑问。
https://stackoverflow.com/questions/60624535
复制相似问题