2014-12-05 22 views
16

ci sono 100s di domande su CORS su web-api e su come abilitare CORS, c'è una risposta diversa che ciascuno fornisce. Sono così confuso e non so quale risposta sia corretta. E il problema è che nessuna delle risposte in realtà lo spiega in senso critico, cosa fa ogni riga di codice, in modo che io possa capire e risolvere il mio problema piuttosto che copiare e incollare il codice.owin cors o web api cors

comunque, la domanda è: sto usando asp.net web api 2 usando owin. E ho bisogno di abilitare CORS. come lo faccio? C'è impostazioni CORS per OWIN

application.UseCors(CorsOptions.AllowAll); 

e c'è impostazioni CORS per asp.net web api

var cors = new EnableCorsAttribute("*", "*", "*", "*"); 
    config.EnableCors(cors); 

quale dovrei usare dato che non sto usando OAuth (sto specificando questo perché risposte su SO differiscono su quando usiamo OAUTH v/s quando non lo usiamo).

Devo abilitare CORS per entrambe le OWIN & WEB-API o solo per una di esse. Non v'è problema se entrambi sono abilitati, read here

Sarebbe veramente utile se qualcuno mi può spiegare la differenza tra

  1. OWIN CORS
  2. CORS WEB API
  3. CORS con OAuth utilizzando OWIN/WebAPI

Inoltre ci sono risposte per self-hosted web API contro Owin ospitato web-api, che aumenta ulteriormente l'confution :(, mi spiace per lo sproloquio

+0

D'accordo, sarebbe sicuro se qualcuno avesse una spiegazione senza essere vaga. – Nicholi

+1

Sto ancora cercando una risposta .. le risposte fornite sono incomplete e non al punto. Non sto cercando come farlo, ci sono così tante altre risposte – harishr

risposta

8

si suppone di utilizzare Web API's CORS se avete bisogno di CORS applicate ai controller API. Per tutto il resto (come un servizio di token) sei bloccato a dover usare Owin.Cors.

Se si finisce per utilizzare entrambi, è necessario assicurarsi che non si sovrappongano e applicare CORS due volte alla stessa richiesta.

Web API 2.2 rende facile abilitare CORS fornendo il EnableCorsAttribute.

Funzioni di base

[EnableCors("*", "*", "*")] 
public class ResourcesController : ApiController 
{ 
    ... 

definizione di attributo

[AttributeUsageAttribute(AttributeTargets.Class|AttributeTargets.Method, AllowMultiple = false)] 
public EnableCorsAttribute(
    string origins, 
    string headers, 
    string methods 
) 

Per abilitare CORS utilizzare globalmente

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     var cors = new EnableCorsAttribute("www.example.com", "*", "*"); 
     config.EnableCors(cors); 
     // ... 
    } 
} 

Sarà inoltre necessario installare il pacchetto CORS da NuGet

Install-Package Microsoft.AspNet.WebApi.Cors 
+0

So come abilitare cors su web-api, quello che voglio sapere è, differenza tra web-api e owin cors, che usare quando . non è su come/dove abilitarlo .... – harishr

+0

CORS di Web API supporta solo i controller, per tutto il resto è necessario utilizzare Owin.Cors. –

+1

cos'è "tutto il resto" – harishr

-1

C'è un modo per risolvere questo problema. Poiché le librerie OWIN e ASP.NET.CORS funzionano contemporaneamente. Il token Owin o il metodo di autenticazione devono essere configurati per abilitare CORS separatamente da tutti gli altri controller API.

cosa Pugno prima, non utilizzare cors con Owin in Startup.cs:

public void Configuration(IAppBuilder app) 
{ 
    //app.UseCors(CorsOptions.AllowAll); 

Trova metodo GrantResourceOwnerCredentials e aggiungere Access-Control-Allow-Origin per contesto così quando ritorna una chiamata dopo l'autenticazione è completato quel browser trova l'intestazione e lo accetta.

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
{ 
     context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "http://localhost" }); 

Ora pacchetto di installazione Microsoft.AspNet.WebApi.Cors dal Nuget al progetto WebAPI, e aggiungi a registrare metodo

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

lavorato per me.