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.
Ответы
Ответ 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
})
}
});