Я создал 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();
});