.Net 5:无法启动 Ocelot,不受支持的身份验证提供程序

Posted

技术标签:

【中文标题】.Net 5:无法启动 Ocelot,不受支持的身份验证提供程序【英文标题】:.Net 5: Unable to start Ocelot, unsupported authentication provider 【发布时间】:2021-12-06 06:51:16 【问题描述】:

我想在 Ocelot API 网关中实现JWT 认证,我仔细遵循了 ocelot documentation 并且也实现了它。但是我遇到了一个错误,没有任何解决办法。

我使用文档中的 section 来启用身份验证。

我收到的错误:

System.AggregateException: '发生一个或多个错误。 (无法 启动 Ocelot,错误是:Authentication Options AuthenticationProviderKey:BaseAuthenticationSchema,AllowedScopes:[] 是 不支持的身份验证提供程序)'

使用过的包:

豹猫(17.0.0)

Microsoft.AspNetCore.Authentication.JwtBearer(5.0.11)

还有我的代码部分以获得更多规范:

Program.cs

public class Program

    public static void Main(string[] args)
    
        CreateHostBuilder(args).Build().Run();
    
    public static IHostBuilder CreateHostBuilder(string[] args) =>
         Host.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((hostingContext, config) =>
                    
                        config
                            .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
                            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                            .AddJsonFile($"appsettings.hostingContext.HostingEnvironment.EnvironmentName.json", optional: true, reloadOnChange: true)
                            .AddJsonFile($"ocelot.json", optional: false, reloadOnChange: true)
                            .AddEnvironmentVariables();
                    )
                    .ConfigureServices(s =>
                    
                        s.AddOcelot();
                    )
                    .ConfigureWebHostDefaults(webBuilder =>
                    
                        webBuilder.UseStartup<Startup>()
                                  .UseSerilog((_, config) =>
                                  
                                      config
                                          .MinimumLevel.Information()
                                          .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
                                          .Enrich.FromLogContext()
                                          .WriteTo.File(@"Logs\AllHttpRequestsLog.txt", rollingInterval: RollingInterval.Day);
                                  )
                                  .Configure(app =>
                                  
                                      app.UseMiddleware<HttpRequestsLoggingMiddleware>();
                                      app.UseOcelot().Wait();
                                  );
                    );

Startup.cs

public void ConfigureServices(IServiceCollection services)

    // Adding Authentication
    var baseAuthenticationProviderKey = "BaseAuthenticationSchema";

    services.AddAuthentication(options =>
    
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
    )

    // Adding Jwt Bearer  
    .AddJwtBearer(baseAuthenticationProviderKey, options =>
    
        options.SaveToken = true;
        options.RequireHttpsMetadata = false;
        options.TokenValidationParameters = new TokenValidationParameters()
        
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateIssuerSigningKey = true,
            ValidateLifetime = true,
            ValidAudience = "ValidAudience",
            ValidIssuer = "ValidIssuer ",
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("IssuerSigningKey"))
        ;
    );

    services.AddControllers();

    services.AddOcelot(_configuration);

最后使用了豹猫的配置:


  "DownstreamPathTemplate": "/api/v1/banks",
  "DownstreamScheme": "https",
  "DownstreamHostAndPorts": [
    
      "Host": "localhost",
      "Port": 44371
    
  ],
  "UpstreamPathTemplate": "/api/market/banks",
  "UpstreamHttpMethod": [ "Get" ],
  "AuthenticationOptions": 
    "AuthenticationProviderKey": "BaseAuthenticationSchema",
    "AllowedScopes": []
  

我调查了所有的文章,还有像这样打开issue的ocelot GitHub页面,但我的问题没有解决。谁能帮帮我?

非常感谢。

【问题讨论】:

【参考方案1】:

最后,我在 Ocelot GitHub 页面打开问题上使用 comment 解决了我的问题。

刚刚将身份验证配置从 startup.cs 文件移动到 .ConfigureServices 部分的 program.cs 文件中。

像这样:

                    .ConfigureServices(s =>
                    
                        // Adding Authentication
                        var baseAuthenticationProviderKey = "BaseAuthenticationSchema";

                        s.AddAuthentication(options =>
                        
                            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
                            options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
                        )

                        // Adding Jwt Bearer  
                        .AddJwtBearer(baseAuthenticationProviderKey, options =>
                        
                            options.SaveToken = true;
                            options.RequireHttpsMetadata = false;
                            options.TokenValidationParameters = new TokenValidationParameters()
                            
                                ValidateIssuer = true,
                                ValidateAudience = true,
                                ValidateIssuerSigningKey = true,
                                ValidateLifetime = true,
                                ValidAudience = "ValidAudience",
                                ValidIssuer = "ValidIssuer",
                                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("Secret"))
                            ;
                        );
                        s.AddOcelot();
                    )

另外,从 startup.cs 类中删除了该配置。

【讨论】:

您真正的问题是弄乱了 Program.ca 和 Startup.cs。您在 Program.cs 中调用 s.AddOcelot();,然后在 Startup.cs 中调用 services.AddOcelot(_configuration);。这不是你的错,只是过时的文档混合了来自 dotnet core 1.1、2.0 和 3.0 的不同时代的配置方法。您应该从 Program.cs 中删除 .ConfigureServices(s =&gt;.Configure(app =&gt; 块并将它们移动到 Startup.cs 文件中:ConfigureServicesConfigure 方法。

以上是关于.Net 5:无法启动 Ocelot,不受支持的身份验证提供程序的主要内容,如果未能解决你的问题,请参考以下文章

将 Ocelot 16.0 与 ASP.Net Core 3.1 集成不起作用,因为我需要将 Swagger 与 Ocelot 一起使用

win10固件不受支持?

微服务专题之.Net6下集成微服务网关-Ocelot

Flutter 无法使用脚本为范围注册 ServiceWorker,该脚本具有不受支持的 MIME 类型

来自Windows服务的Plink无法找到Pageant

编译器开发系列--Ocelot语言5.表达式的有效性检查