Я знаю, что у нас много вопросов, похожих на этот, но я попробовал все, и кажется, что моя проблема немного отличается.
, как и все остальные вопросы, у меня есть клиент (localhost:XXXX) отправка запроса на мой Api (localhost: YYYY)
проблема возникла, я полагаю, потому что я также использую XSRF, и, вероятно, промежуточное ПО CORS по умолчанию не разрешает все заголовки, а только запрашиваемые заголовки
Я выяснил, что иногда случайным образом запрос на стороне клиента приходит вместе с запросом XSRF, а затем сервер возвращает заголовок, разрешающий его, но это действительно случайно.
Пример:
Запрос:
1 => Заголовки-Access-Control-Request: авторизация
2 => Заголовки-Access-Control-Request: авторизация, XSRF-TOKEN
Response
1 => Access-Control-Allow-Headers: авторизация
2 => Access-Control-Allow-Headers: авторизация, XSRF-TOKEN
Iожидал, что когда я установлю opt.AllowAnyHeader()
, ответ должен вернутьсяrn always Access-Control-Allow-Headers: *
, но похоже, что он вернет только запрошенные заголовки.
так что я должен что-то сделать на угловой стороне, чтобы запросить все заголовки? (мне действительно не нравится эта идея), ячто-то не так на стороне API?или я должен просто пойти и создать свое собственное промежуточное программное обеспечение для работы с CORS (я тоже думаю, что это не очень хорошая идея)?
На моем Api я установил
public void ConfigureServices(IServiceCollection services)
{
this.AddDependencyInjection(services);
if (this.Configuration.GetValue<bool>("EnableCors", false))
{
services.AddCors();
}
this.ConfigureAuth(services);
services.AddAntiforgery(options =>
{
options.HeaderName = "X-XSRF-TOKEN";
});
// ...
}
// ...
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IAntiforgery antiforgery)
{
if (this.Configuration.GetValue<bool>("EnableCors", false))
{
app.UseCors(opt => opt
.AllowAnyHeader()
.AllowAnyMethod()
.AllowAnyOrigin()
.AllowCredentials()
);
}
app.Use(next => context =>
{
if (string.Equals(context.Request.Path.Value, "/token", StringComparison.OrdinalIgnoreCase))
{
var tokens = antiforgery.GetAndStoreTokens(context);
context.Response.Cookies.Append("XSRF-TOKEN", tokens.RequestToken, new CookieOptions() { HttpOnly = false });
}
return next(context);
});
// ...
}
и на угловой стороне,У меня есть:
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
HttpClientModule,
HttpClientXsrfModule
],
providers: [
httpInterceptorProviders,
AuthService
],
bootstrap: [AppComponent]
})
Я играю с auth и CORS, так что весь мой код в основном является доказательством кодов концептов, и я могу поделиться, если это необходимо, но я думаю, этого достаточно.