Подтвердить что ты не робот

Web Api 2 Предполетный запрос CORS для носителя

У меня есть веб-приложение с интерфейсом AngularJS и веб-интерфейсом Web Api 2, и он использует токены-носители для аутентификации.

Все хорошо в FireFox и IE, но с Chrome мой первоначальный запрос на вход - это НЕКОТОРЫЕ ПРОСТОТА.

Здесь вызов службы AngularJS:

$http.post(http://localhost:55483/token, data, {headers: {'Content-Type': 'application/x-www-form-urlencoded'}}). success (function (response) {...} );

Запрос предполетного бита возвращается с ошибкой "Разрешить доступ-Контроль-Происхождение".

Однако, если я снова нажму кнопку Login (тем самым пересылаю вышеуказанный запрос), все будет хорошо.

Любая идея о том, как предотвратить/уловить/обработать это?

PS: Я использую LOC

context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });

в файле ApplicationOAuthProvider.cs, чтобы поместить заголовок разрешения CORS в запрос /Token, который отлично работает в IE, FireFox и иногда в Chrome.

4b9b3361

Ответ 1

Ниже приводится примечание Fancy:

Выяснил это с помощью поста слева от LeftyX 29 июня:
- Move этот LOC app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); к FIRST LINE в ConfigureAuth методе Startup.Auth.cs.
- Затем, УДАЛИТЬ этот LOC context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" }); из метода GrantResourceOwnerCredentials() ApplicationOAuthProvide.cs.

Предполетный CORS-запрос их получает обрабатывается правильно, а затем фактический запрос проходит через


Спасибо мужчине, ты спасешь весь день.
Потому что это случается для многих парней, я привожу ваш комментарий в поле ответа, чтобы другие ребята могли это видеть.

Я не хочу проголосувать за это. Пожалуйста, прокомментируйте мой ответ вместо

Спасибо вам

Ответ 2

Я надеюсь, что это поможет кому-то помочь. Для меня:

  • добавление app.useCors(); LOC не помогло.
  • Добавление app.useCors(); LOC работало для других людей в моей команде.

Поэтому мне нужно решение, которое будет работать во всех средах.

В конечном итоге то, что я закончил, это добавить заголовок и значение прямо в Web.config со следующим (где localhost: 9000 - это мое приложение node, обслуживающее angular))

<system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="http://localhost:9000" />
        <add name="Access-Control-Allow-Headers" value="Content-Type"/>
      </customHeaders>
    </httpProtocol>
  </system.webServer>

Затем в процессе производства вы можете просто изменить исходное значение на исходный URL-адрес производственного процесса.

Если вы хотите, чтобы CORS был включен для всех источников, измените значение на "*".

Ответ 3

По умолчанию - Access-Control-Max-Age: секунды равно 0, а ваши запросы не кэшируются.

Попробуйте установить максимальное значение: (Owin selfhost). Он решает проблему с дополнительными запросами OPTIONS

            app.UseCors(new CorsOptions
            {
                PolicyProvider = new CorsPolicyProvider
                {
                    PolicyResolver = context => Task.FromResult(new CorsPolicy
                    {
                        AllowAnyHeader = true,
                        AllowAnyMethod = true,
                        AllowAnyOrigin = true,
                        SupportsCredentials = false,
                        PreflightMaxAge = Int32.MaxValue // << ---- THIS
                    })
                }
            });