Owin cors или web api cors
есть 100 вопросов о CORS на web-api, и о том, как включить CORS, есть другой ответ, который каждый из них предоставляет. Я настолько смущен и не знаю, какой ответ правильный. И проблема в том, что ни один из ответов на самом деле не объясняет, насколько это важно, каждая строка кода, чтобы я мог понять и решить мою проблему, а не копировать код.
в любом случае, вопрос: я использую asp.net web api 2, используя owin. И мне нужно включить CORS. как мне это сделать? Для OWIN есть настройки cors
application.UseCors(CorsOptions.AllowAll);
и есть настройки cors для asp.net web api
var cors = new EnableCorsAttribute("*", "*", "*", "*");
config.EnableCors(cors);
который я должен использовать, учитывая, что я не использую OAUTH (я указываю это, потому что ответы на SO отличаются, когда мы используем OAUTH v/s, когда мы его не используем).
Нужно ли включать CORS для OWIN и WEB-API или только для одного из них. Существует проблема, если оба включены, читайте здесь
Было бы очень полезно, если кто-то может объяснить мне разницу между
- OWIN CORS
- WEB API CORS
- CORS с OAUTH с использованием OWIN/WEBAPI
Также есть ответы на самообслуживаемые веб-api против owin, размещенные в web-api, что дополнительно добавляет к confution:(, извините за rant
Ответы
Ответ 1
Предполагается использовать Web API CORS
, если вам требуется CORS для ваших API-контроллеров. Для всего остального (например, для токена) вы застряли в использовании Owin.Cors
.
Если вы закончите использовать оба варианта, вам нужно убедиться, что они не перекрываются и дважды применяются к CORS для одного и того же запроса.
Web API 2.2
позволяет легко включить CORS, предоставив EnableCorsAttribute
.
Основное использование
[EnableCors("*", "*", "*")]
public class ResourcesController : ApiController
{
...
Определение атрибута
[AttributeUsageAttribute(AttributeTargets.Class|AttributeTargets.Method, AllowMultiple = false)]
public EnableCorsAttribute(
string origins,
string headers,
string methods
)
Чтобы включить CORS во всем мире, используйте
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
var cors = new EnableCorsAttribute("www.example.com", "*", "*");
config.EnableCors(cors);
// ...
}
}
Вам также потребуется установить пакет CORS из nuget
Install-Package Microsoft.AspNet.WebApi.Cors
Ответ 2
Есть способ исправить это. Поскольку библиотеки OWIN и ASP.NET.CORS работают одновременно. Oken-токен или метод аутентификации необходимо настроить для включения CORS отдельно от всех других контроллеров API.
Прежде всего, не используйте cors с Owin в Startup.cs:
public void Configuration(IAppBuilder app)
{
//app.UseCors(CorsOptions.AllowAll);
Найдите метод GrantResourceOwnerCredentials и добавьте контекст Access-Control-Allow-Origin, чтобы при возврате вызова после завершения аутентификации браузер нашел заголовок и принял его.
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "http://localhost" });
Теперь установите пакет Microsoft.AspNet.WebApi.Cors из Nuget в проект webapi и добавьте его в метод Register
public static void Register(HttpConfiguration config)
{
var cors = new EnableCorsAttribute("http://localhost, ", "accept,accesstoken,authorization,cache-control,pragma,content-type,origin", "GET,PUT,POST,DELETE,TRACE,HEAD,OPTIONS");
config.EnableCors(cors);
Работал для меня.