Angular 6 CORS с XSRF на Net.Core не запрашивает все заголовки - PullRequest
0 голосов
/ 02 октября 2018

Я знаю, что у нас много вопросов, похожих на этот, но я попробовал все, и кажется, что моя проблема немного отличается.

, как и все остальные вопросы, у меня есть клиент (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, так что весь мой код в основном является доказательством кодов концептов, и я могу поделиться, если это необходимо, но я думаю, этого достаточно.

1 Ответ

0 голосов
/ 03 октября 2018

У меня была похожая проблема с пользовательским заголовком, но с бэкендом Node.js.Решением было добавить заголовок access-control-expose-headers в ответ сервера.

Не забудьте использовать подстановочный знак, но полное имя настраиваемого заголовка, например: access-control-expose-headers: x-my-custom-header

Эта проблема связана с более низкими уровнями API браузеров для запросов XHR, которые обычно не являются угловой структурой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...