Problem z CORSem dla Windows Authentication

0

Piszę tutaj, bo nie mogłem nic znaleźć na stacku, a może ktoś już kiedyś miał podobny problem i będzie wiedział co się dzieje :D

Podstawe informacje:

  • API: ASP.NET Core 3.1
  • Klient: Angular 8
  • Serwer: IIS

Tak wygląda CORS w startup.cs:

app.UseCors(x => x.SetIsOriginAllowed(_ => true)
                              .AllowAnyMethod()
                              .AllowAnyHeader()
                              .AllowCredentials()); 

A tak wyglądają dwie metody w Angularze:

public GetPostData(product: string, baseline: string, startDate: string, tags_any_of: string, tags_all_of: string, tags_except: string, cycle: string, os: string, vertical: string, testItemStatus: string, staticColumns: string, aggregation: string) {

    return this.httpClient.get(`${environment.apiUrl}/api/Noise/${product}&${baseline}&${startDate}&${tags_any_of}&${tags_all_of}&${tags_except}&${cycle}&${os}&${vertical}&${testItemStatus}&${staticColumns}&${aggregation}`).pipe(map(response => {
      return response;
    }, 
    catchError(err => ([]))));
  }

public GetAllTags() {
    return this.httpClient.get<TagModel[]>(`${environment.apiUrl}/api/Noise/tags`).pipe(map(response => {
      console.log(response)
      return response
    },
    catchError(err => of([]))));
  };

Na czym polega problem:
Funkcja GetAllTags() przechodzi bez problemu i mogę wyciągnać dane z API, natomiast w momencie w którym puszczam funkcję GetPostData() to wywala:

Access to XMLHttpRequest at "XXX" from origin "YYY" has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

HTTP/1.1 400 Bad Request
Content-Type: text/html; charset=us-ascii
Server: Microsoft-HTTPAPI/2.0
Date: Wed, 24 Jun 2020 14:27:33 GMT
Connection: close
Content-Length: 324

I nie przechodzi w dwóch wypadkach:

  • Kiedy puszczam request z klienta na localhoscie do API na serwerze
  • Kiedy puszczam request z klienta postawionego na tym samym serwerze, na którym stoi API.

A przechodzi w takich wypadkach:

  • Z klienta na serwerze do API localhostowego
  • Z klienta na localhoscie do API na localhoscie
  • Wtedy, kiedy parametry są pojedyńcze, czyli np. 1 wpisany parametr dla każdej kategorii (I to działa dla wszystkich możliwości)

Funkcja odpowiedzialna za "odbiór" danych przechodzi normalnie podczas debugowania. Logowanie mam ustawione za pomocą NLoga, ale w samych logach nie ma żadnego errora, ani nic nie wywala.

Pomocy xD

1

Do Reacta używałem czegoś takiego

     services.AddCors(options => options.AddPolicy("CorsPolicy", builder => builder
                .AllowAnyMethod()
                .WithOrigins("http://localhost:3000")
                .AllowAnyHeader()
                .AllowCredentials()));

A potem jeszcze app.UseCors("CorsPolicy"); w drugiej metodzie Configure.

0
SkrzydlatyWąż napisał(a):

Do Reacta używałem czegoś takiego

     services.AddCors(options => options.AddPolicy("CorsPolicy", builder => builder
                .AllowAnyMethod()
                .WithOrigins("http://localhost:3000")
                .AllowAnyHeader()
                .AllowCredentials()));

A potem jeszcze app.UseCors("CorsPolicy"); w drugiej metodzie Configure.

Nie zadziałało niestety, dalej to samo :(

1
Sirvius napisał(a):
SkrzydlatyWąż napisał(a):

Do Reacta używałem czegoś takiego

     services.AddCors(options => options.AddPolicy("CorsPolicy", builder => builder
                .AllowAnyMethod()
                .WithOrigins("http://localhost:3000")
                .AllowAnyHeader()
                .AllowCredentials()));

A potem jeszcze app.UseCors("CorsPolicy"); w drugiej metodzie Configure.

Nie zadziałało niestety, dalej to samo :(

Tak tylko dla pewności spytam zmieniłeś "http://localhost:3000" na twoje źródło? Dodałeś w controlerze [EnableCors()]?

0
Botek napisał(a):
Sirvius napisał(a):
SkrzydlatyWąż napisał(a):

Do Reacta używałem czegoś takiego

     services.AddCors(options => options.AddPolicy("CorsPolicy", builder => builder
                .AllowAnyMethod()
                .WithOrigins("http://localhost:3000")
                .AllowAnyHeader()
                .AllowCredentials()));

A potem jeszcze app.UseCors("CorsPolicy"); w drugiej metodzie Configure.

Nie zadziałało niestety, dalej to samo :(

Tak tylko dla pewności spytam zmieniłeś "http://localhost:3000" na twoje źródło? Dodałeś w controlerze [EnableCors()]?

Tak, próbowałem też wywalić AllowCredentials() i dałem AllowAnyOrigin() i też nie działa :(

1

Kurcze troszkę więcej kodu by się przydało. Bo trudno coś powiedzieć

ConfigureServices

services.AddCors(options =>
          {
              options.AddDefaultPolicy(
                                builder =>
                                {
                                    builder.WithOrigins("abcd");
                                    builder.AllowAnyMethod();
                                    builder.AllowAnyHeader();
                                    builder.AllowCredentials();
                                    
                                });
          });

Configure

app.UseCors();

No i w kontrolerze

[EnableCors()]

Ja używam takiej składni jeśli nie potrzebuję mieć innych corsów. Ale to takie pisanie u mnie działa. Trochę za mało kodu by móc coś stwierdzić

0
Botek napisał(a):

Kurcze troszkę więcej kodu by się przydało. Bo trudno coś powiedzieć

ConfigureServices

services.AddCors(options =>
          {
              options.AddDefaultPolicy(
                                builder =>
                                {
                                    builder.WithOrigins("abcd");
                                    builder.AllowAnyMethod();
                                    builder.AllowAnyHeader();
                                    builder.AllowCredentials();
                                    
                                });
          });

Configure

app.UseCors();

No i w kontrolerze

[EnableCors()]

Ja używam takiej składni jeśli nie potrzebuję mieć innych corsów. Ale to takie pisanie u mnie działa. Trochę za mało kodu by móc coś stwierdzić

Zrobiłem tak i też to nie pomogło, ale chyba już wiem konkretnie o co chodzi:

Localhost który jest na HTTPS normalnie przepuszcza request.
API na serwerze jest na HTTP i nie przepuszcza i wywala ten sam błąd.
Localhost jak jest na HTTP to też nie przepuszcza i wywala ten sam błąd.

I tylko nie wiem pod jakim hasłem tego szukać, bo wpisanie "CORS problems with HTTPS to HTTP requests" raczej nie zwraca nic konkretnego. I dalej pozostaje kwestia tego, że jeden endpoint normalnie mi zwraca przez HTTP dane, ale drugi już nie (wielkość danych ma znaczenie tutaj?) :D

1

Przy takim błędzie to wątpię. Skoro corspolicy nie pozwoliło to znaczy ,że cors nie przepuściły.

Sirvius napisał(a):
Access to XMLHttpRequest at "XXX" from origin "YYY" has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

HTTP/1.1 400 Bad Request
Content-Type: text/html; charset=us-ascii
Server: Microsoft-HTTPAPI/2.0
Date: Wed, 24 Jun 2020 14:27:33 GMT
Connection: close
Content-Length: 324

Skopiowałeś to "YYY" dokładnie do corsów?

1

Możesz wrzucić całą metodą Configure? W którym miejscu używasz app.UseCors()?

1

MAM! :D

W końcu przeszedł request z localhosta do API.

https://stackoverflow.com/questions/31942037/how-to-enable-cors-in-asp-net-core -> Post użytkownika Rosdi Kasim, o odblokowaniu "OPTIONS" w "Request Filtering". Nigdy w życiu bym na to nie wpadł, że leci jakiś Preflight Request na serwer, który on sobie po prostu odrzuca i nie wyrzuca nic o tym, że Request typu OPTIONS nie przechodzi, tylko po prostu zostawia ślad w postaci "400 Bad Request" xD

Dzięki wielkie za pomoc! :D

Edit: Przedwczesna radość niestety :(

0
Sirvius napisał(a):

MAM! :D

W końcu przeszedł request z localhosta do API.

https://stackoverflow.com/questions/31942037/how-to-enable-cors-in-asp-net-core -> Post użytkownika Rosdi Kasim, o odblokowaniu "OPTIONS" w "Request Filtering". Nigdy w życiu bym na to nie wpadł, że leci jakiś Preflight Request na serwer, który on sobie po prostu odrzuca i nie wyrzuca nic o tym, że Request typu OPTIONS nie przechodzi, tylko po prostu zostawia ślad w postaci "400 Bad Request" xD

Dzięki wielkie za pomoc! :D

Niestety nie działa jednak, źle spojrzałem i dalej działa tylko w wypadku podania po jednym parametrze, zamiast paru po przecinkach.

Skopiowałeś to "YYY" dokładnie do corsów?

Tak

Możesz wrzucić całą metodą Configure? W którym miejscu używasz app.UseCors()?

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseCors("AllowAll");

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });

            app.UseExceptionHandler(a => a.Run(async context =>
            {
                var feature = context.Features.Get<IExceptionHandlerPathFeature>();
                var exception = feature.Error;

                var result = JsonConvert.SerializeObject(new { error = exception.Message });
                context.Response.ContentType = "application/json";
                await context.Response.WriteAsync(result);
            }));

            app.UseSwagger();
            app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "NoiseAPI V1");
            });
        }

Nic nadzwyczajnego nie ma, teoretycznie mogę jeszcze na pałę wpisać w web.configu wszystkie te headery potrzebne, ale wolałbym tego uniknąć xD

0

Rozwiązanie jest jeszcze głupsze niż to poprzednie xD

@Botek, @SkrzydlatyWąż
Maksymalna długość URL'a w IIS'ie to 320 znaków. Mój URL po wpisaniu wszystkiego ma 330 znaków. Więc po wykasowaniu odpowiedniej ilości znaków w Query stringu, request przechodzi. Więc wystarczy zmienić jeden parametr w regedit -> https://stackoverflow.com/questions/40448588/i-get-a-400-bad-request-invalid-url-when-the-length-of-the-request-exceeds-320

Jeszcze raz dzięki za pomoc i sorry za spam :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1