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);

Работал для меня.