Веб-приложение .NET Core, обслуживающее SPA: заблокировано политикой CORS: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin» - PullRequest
0 голосов
/ 29 сентября 2019

Основная проблема в следующем:

Моя конечная точка '/ api / users / githublogin' работает нормально, если ее запрашивает обычный GET из браузера или обычный GET из Postman.Однако XHR, fetch и axios все выдают одну и ту же ошибку:

Доступ к выборке в 'https://github.com/login/oauth/authorize?etc' (перенаправлено из' https://localhost:5001/api/users/githublogin') из источника 'https://localhost:5001' был заблокирован политикой CORS: в запрашиваемом ресурсе отсутствует заголовок «Access-Control-Allow-Origin». Если непрозрачный ответ удовлетворяет ваши потребности, установите режим запроса «no-cors», чтобы получить ресурсс отключенным CORS.


Существует пара связанных вопросов, больше связанных с Angular, чем с React, но проблема, похоже, та же:

Включить CORS в ASP .NET Core 2.1 Web Api

Нет заголовка «Access-Control-Allow-Origin». XmlHttpRequest

.NET CORE 2.0 Angular 5: разрешение Cors

Локальный запрос пост-выборки Javascript завершается неудачно с вызовом веб-API ASP.NET Core 2.2. CORS включается

Я реализовал их ответы без успеха.


Вот мой серверкод стороны, касающийся политики CORS:

внутри метода ConfigureServices:

            services.AddCors();

внутри метода Configure:

app.UseCors(x => x
                .AllowAnyHeader()
                .AllowAnyMethod()
                .AllowAnyOrigin()
                .AllowCredentials());

на моей клиентской стороне, кнопка вызывает этокод:

fetch('/api/users/githublogin');

Ниже следует журнал сервера в момент выполнения неудавшегося запроса:

info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET https://localhost:5001/api/users/githublogin application/json 
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request starting HTTP/1.1 GET https://localhost:5001/api/users/githublogin application/json 
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'web_server.Controllers.UsersController.GitHubLogin (web-server)'
Microsoft.AspNetCore.Routing.EndpointMiddleware:Information: Executing endpoint 'web_server.Controllers.UsersController.GitHubLogin (web-server)'
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[3]
      Route matched with {action = "GitHubLogin", controller = "Users"}. Executing controller action with signature Microsoft.AspNetCore.Mvc.ActionResult GitHubLogin(System.String) on controller web_server.Controllers.UsersController (web-server).
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Route matched with {action = "GitHubLogin", controller = "Users"}. Executing controller action with signature Microsoft.AspNetCore.Mvc.ActionResult GitHubLogin(System.String) on controller web_server.Controllers.UsersController (web-server).
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
      Executing action method web_server.Controllers.UsersController.GitHubLogin (web-server) - Validation state: Valid
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Executing action method web_server.Controllers.UsersController.GitHubLogin (web-server) - Validation state: Valid
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Executed action method web_server.Controllers.UsersController.GitHubLogin (web-server), returned result Microsoft.AspNetCore.Mvc.ChallengeResult in 0.7161ms.
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
      Executed action method web_server.Controllers.UsersController.GitHubLogin (web-server), returned result Microsoft.AspNetCore.Mvc.ChallengeResult in 0.7161ms.
info: Microsoft.AspNetCore.Mvc.ChallengeResult[1]
      Executing ChallengeResult with authentication schemes ().
Microsoft.AspNetCore.Mvc.ChallengeResult:Information: Executing ChallengeResult with authentication schemes ().
info: Microsoft.AspNetCore.Authentication.OAuth.OAuthHandler`1[[Microsoft.AspNetCore.Authentication.OAuth.OAuthOptions, Microsoft.AspNetCore.Authentication.OAuth, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60]][12]
      AuthenticationScheme: GitHub was challenged.
Microsoft.AspNetCore.Authentication.OAuth.OAuthHandler`1[[Microsoft.AspNetCore.Authentication.OAuth.OAuthOptions, Microsoft.AspNetCore.Authentication.OAuth, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60]]:Information: AuthenticationScheme: GitHub was challenged.
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
      Executed action web_server.Controllers.UsersController.GitHubLogin (web-server) in 76.0766ms
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'web_server.Controllers.UsersController.GitHubLogin (web-server)'
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Executed action web_server.Controllers.UsersController.GitHubLogin (web-server) in 76.0766ms
Microsoft.AspNetCore.Routing.EndpointMiddleware:Information: Executed endpoint 'web_server.Controllers.UsersController.GitHubLogin (web-server)'
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request finished in 145.364ms 302 
      Request finished in 145.364ms 302 

Ничего не касается CORS.На самом деле во всем журнале сервера упоминается только это:

warn: Microsoft.AspNetCore.Cors.Infrastructure.CorsService[11]
      The CORS protocol does not allow specifying a wildcard (any) origin and credentials at the same time. Configure the policy by listing individual origins if credentials needs to be supported.
Microsoft.AspNetCore.Cors.Infrastructure.CorsService:Warning: The CORS protocol does not allow specifying a wildcard (any) origin and credentials at the same time. Configure the policy by listing individual origins if credentials needs to be supported.
info: Microsoft.AspNetCore.Cors.Infrastructure.CorsService[4]
      CORS policy execution successful.
Microsoft.AspNetCore.Cors.Infrastructure.CorsService:Information: CORS policy execution successful.


Теперь мне кажется, что мой сервер правильно выполняет действия, которые он должен выполнять.То, что 302 Found (если я не ошибаюсь) - это, по сути, сигнал клиенту о перенаправлении на эту конечную точку github.Итак, если мой сервер не генерирует исключение, связанное с CORS, для запроса (или, тем не менее, это работает), и на самом деле установлен флаг AllowAnyOrigins, почему клиент получает эту ошибку?И почему он не получает его, когда браузер отправляет запрос GET?

Следует отметить, что это сервер разработки.В соответствии с документацией, я использую опцию spa.UseProxyToSpaDevelopmentServer("http://localhost:3000");.Это единственное, что я могу себе представить, это связываться со мной, поскольку технически запросы поступают из разных источников (с порта 3000 на порт 5001), но я считаю, что это не должно быть проблемой, учитывая флаг AllowAnyOrigins.

API был построен на основе базового шаблона веб-интерфейса ASP.NET Core 2.2.Клиент был собран с помощью create-реакции-приложения.Они оба очень шаблонные.

Может ли кто-нибудь помочь объяснить это?

1 Ответ

1 голос
/ 29 сентября 2019

Вот мой код на стороне сервера, касающийся политики CORS ...

Это не имеет значения, потому что вы делаете запрос на сервер GitHub.Политика сервера GitHub - единственная, которая применима здесь, и вы не контролируете ее.

Моя конечная точка '/ api / users / githublogin' работает нормально, если ее запрашивает обычный GET из браузера,или обычный GET от Почтальона.

Правильно, и это потому, что вы владеете '/ api / users / githublogin', тогда как вы не владеете https://github.com/login/oauth/authorize?etc.

И CORS действительно заблокирован, GitHub: https://github.com/isaacs/github/issues/330


Решение:

  • Поскольку CORS работает только в рамкахбраузер, переделайте свою архитектуру и внедрите свой собственный веб-прокси на стороне сервера, чтобы сделать вызов GitHub на стороне сервера ;не на стороне клиента в браузере.

Вот еще несколько ресурсов о CORS:

...