绕过Ocelot API网关

时间:2019-05-13 22:44:42

标签: c# api jwt microservices ocelot

我有一个API网关,在这种情况下称为Gateway.Api。在Startup类中,我具有以下内容:

public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddOcelot(Configuration);
        services.AddMvc();

        var appSettingSection = Configuration.GetSection("AppSettings");
        services.Configure<AppSettings>(appSettingSection);

        var appSettings = appSettingSection.Get<AppSettings>();
        var key = Encoding.ASCII.GetBytes(appSettings.Secret);

        services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
            {
                options.SaveToken = true;
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = new SymmetricSecurityKey(key),
                    ValidateIssuer = false,
                    ValidateAudience = false
                };
        });
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseAuthentication();
        app.UseOcelot().Wait();
        app.UseMvc();
    }

如您所见,它定义了身份验证方案。

使用Ocelot的{​​{1}}具有以下配置文件:

Gateway.Api

当我尝试不使用令牌访问http://localhost:50333/api/customer(Gateway.Api的端口为50333)时,我收到401响应,证明配置文件和身份验证均有效。

除了“客户”微服务外,我还有一个“身份”微服务,该服务使用户可以使用有效的用户名和密码进行身份验证,然后发出令牌。使用此令牌然后致电客户服务,我会收到成功的响应(200 OK)。

现在由于某种原因,如果我不使用网关就直接访问客户服务(所以http://localhost:50366/api/customer),则可以在没有令牌的情况下获得成功的响应。

以下是客户微服务:

{
  "ReRoutes": [
    {
      "DownstreamPathTemplate": "/api/customer",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 50366
        }
      ],
      "UpstreamPathTemplate": "/api/customer",
      "UpstreamHttpMethod": [ "Get" ],
      "AuthenticationOptions": {
        "AuthenticationProviderKey": "Bearer",
        "AllowedScopes": []
      }
    },
    {
      "DownstreamPathTemplate": "/api/user/authenticate",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 50353
        }
      ],
      "UpstreamPathTemplate": "/api/user/authenticate",
      "UpstreamHttpMethod": [ "Post" ]
    }
  ],
  "GlobalConfiguration": {
    "UseServiceDiscovery": false
  }
}

这是否意味着我必须向每个微服务[Route("api/[controller]")] public class CustomerController : Controller { [HttpGet] public IEnumerable<string> Get() { var customers = new string[] { "test", "test" }; return customers; } } 类添加身份验证方案?如果是这样,这不是矫kill过正吗?

我尝试在客户微服务中的操作上使用Startup属性,但这引发了一个例外,即它们不是默认的身份验证方案。

2 个答案:

答案 0 :(得分:1)

这是开发环境,因此您可以直接访问url。您的客户服务不知道网关。在实际生产环境中,通常只公开API网关,其余服务位于防火墙(专用子网)后面。只有API网关可以访问它们。访问服务的唯一方法是通过网关。但是,如果要公开公开服务,则必须进行单独的服务身份验证。

无论如何,向要保护的服务添加身份验证始终是一个好主意。

答案 1 :(得分:0)

让我们这样理解,为什么我们要使用API​​ Gateway?

使用API​​网关的原因很多,其中之一是:

以便我们可以在API网关上添加身份验证,而不是在许多微服务中添加身份验证代码。

在生产服务器计算机中,我们仅为最终用户打开API网关端口,用户不知道其他micros服务在何处托管,也无法通过尝试其他端口来访问,因为其他端口未打开!

我们也可以将micros服务放在另一台机器中,该机器只能通过将IP网关列入IP地址白名单来访问托管API网关的机器。

但是在这种情况下,您可以信任开发人员和DevOps团队,否则您可以对高价值微服务进行进一步的身份验证,并且此身份验证与最终用户使用的身份验证没有什么不同,这里您将对API进行身份验证网关。