Проблема с ASP. NET токенами Core API? - PullRequest
1 голос
/ 07 мая 2020

Я создал API с ASP. Net Core 3.1, который будет использоваться с IIS в качестве обратного прокси-сервера для Kestrel (вне процесса). Я использую внутреннюю базу данных для аутентификации. API работает нормально при локальном запуске, но не на сервере IIS.

Ошибка почтальона, которую я получаю:

Ошибка: подключите ETIMEDOUT xxxx: 443 Предупреждение: этот запрос не был отправлен полностью и, возможно, не содержит всех необходимых системных заголовков

При локальном запуске токен, который я получаю, выглядит так:

{alg: "HS512", typ: "JWT"}. {unique_name: "2", nbf: 1588861522, exp: 1588865122, iat: 1588861522}. [подпись]

На сервере я могу запустить приложение на консоли и получить результаты через IE, поэтому мне интересно, может ли проблема быть в токенах JWT или, возможно, в Заголовок MS-ASPNETCORE-TOKEN, который отправляется в Kestrel? Обрабатывается ли пересылка MS-ASPNETCORE-TOKEN в Kestrel за кулисами, или мне нужно это настроить? Документация заставляет меня думать, что все это обрабатывается автоматически.

Единственная ошибка, которую я видел в журналах (хотя я не получаю ее постоянно):

'MS-ASPNETCORE -TOKEN 'не соответствует ожидаемому токену сопряжения' 88c68a82-4b24-4876-ad11-6f78238c8800 ', запрос отклонен

Кто-нибудь видит, в чем может заключаться моя проблема?

Программа. cs:

        public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseKestrel();
                webBuilder.UseIISIntegration();
                webBuilder.UseStartup<Startup>();
            });

Startup.cs:

    public Startup(IConfiguration configuration)
    {
        _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        var connectionString = _configuration["connectionStrings:PecanDBConnectionString"];
        services.AddDbContext<PecanContext>(o =>
        {
            o.UseSqlServer(connectionString);
        });

        //services.AddCors();
        services.AddControllers();
        services.Configure<IISOptions>(options =>
        {
            options.AutomaticAuthentication = false;
            options.ForwardClientCertificate = false;
        });

        //configure DI for application services
        services.AddScoped<IAccInfoRepository, AccInfoRepository>();
        services.AddScoped<IAccPlantRepository, AccPlantRepository>();
        services.AddScoped<IPlantLocationRepository, PlantLocationRepository>();
        services.AddScoped<INutQualityRepository, NutQualityRepository>();
        services.AddScoped<IPlantImageRepository, PlantImageRepository>();
        services.AddScoped<IUserService, UserService>();

        services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());

        //configure strongly typed settings objects
        var appSettingsSection = _configuration.GetSection("AppSettings");
        services.Configure<AppSettings>(appSettingsSection);

        //configure jwt authentication
        var appSettings = appSettingsSection.Get<AppSettings>();
        var key = Encoding.ASCII.GetBytes(appSettings.Secret);
        services.AddAuthentication(x =>
        {
            x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        })
        .AddJwtBearer(x =>
        {
            x.RequireHttpsMetadata = true;
            x.SaveToken = true;
            x.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuerSigningKey = true,
                IssuerSigningKey = new SymmetricSecurityKey(key),
                ValidateIssuer = false,
                ValidateAudience = false,
                ValidateLifetime = true,
                ClockSkew = TimeSpan.Zero
            };
        });
    }

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

            app.Use(async (context, next) =>
                {
                await next();
                if (context.Response.StatusCode == 404 && !Path.HasExtension(context.Request.Path.Value))
                {
                    context.Request.Path = "/index.html";
                    await next();
                }
            });
            //app.UseHsts();
        }

        app.UseHttpsRedirection();

        app.UseRouting();

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...