首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于Ocelot认证的文档

关于Ocelot认证的文档
EN

Stack Overflow用户
提问于 2020-03-10 19:19:41
回答 1查看 4.2K关注 0票数 3

我正在努力学习并研究如何将我当前的asp.net api拆分成一组较小的api,以尝试制作一个微服务应用程序(主要是为了学习目的)。我正在使用Ocelot作为网关,我发现Ocelot很好,很容易设置。但是,我发现很难找到适当的文档,例如,如何添加身份验证,因为ocelot.readthedocs.io在这方面感到恐惧。我很难弄清楚我是否应该在我的网关api中创建我的注册和登录方法,还是将其保留在保存用户数据库的微服务中?也许我应该将我的网关api连接到用户数据库,以便进行直接的交互?(感觉它似乎违背了微型服务的目的)。

在我看来,只对重路由进行身份验证听起来还有点不安全,与在单块应用程序中对http方法进行身份验证相比。但我可能忽略了整件事。否则,如果你们知道任何很好的信息来源,那就太好了,因为我很难为ocelot和asp.net微服务找到艺术品、教程、课程或任何类似性质的东西。

EN

回答 1

Stack Overflow用户

发布于 2020-03-12 06:39:32

我们正在做同样的微服务方法,我们通过覆盖标准的ocelot身份验证中间件来解决它。

在启动(.net核心)的配置部分中,我们将其实现如下:

代码语言:javascript
复制
 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,

通常,微服务本身不能直接访问,而是部署在后面的服务器层。只有才允许访问它们.优点是,您的微服务不需要关心身份验证、授权等。

希望它能澄清你的疑问。

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

https://stackoverflow.com/questions/60624535

复制
相关文章

相似问题

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