2014-11-17 17 views
18

Ho un'app Web con un front-end AngularJS e un back-end Web Api 2 e utilizza i token bearer per l'autenticazione.Web Api 2 Preflight richiesta CORS per token bearer

Tutto va bene in FireFox & IE, ma con Chrome, la mia richiesta di accesso iniziale è SOMETIMES pre-flight.

Ecco la chiamata dal servizio AngularJS:

$ http.post (http://localhost:55483/token, dati, {headers: { 'Content-Type': '/ x-www-form-urlencoded applicazione'}}). successo (funzione (risposta) {...});

La richiesta di preflight viene respinta con un errore "Allow-Access-Control-Origin".

Tuttavia, se faccio di nuovo clic sul pulsante Login (inviando nuovamente la richiesta di cui sopra) tutto va bene.

Qualche idea su come impedire/trap/gestire questo?

PS: io uso la LOC

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

nel file ApplicationOAuthProvider.cs per mettere il CORS consentono-header su richiesta/token, che funziona bene in IE, FireFox e talvolta in Chrome.

+0

Hai aggiunto 'allowcors' all'avvio per' webapi'? –

+0

Intendi questo LOC: app.UseCors (Microsoft.Owin.Cors.CorsOptions.AllowAll); Ho provato a mettere che in ma il compilatore dice: Owin.IAppBuilder' non contiene una definizione per '' UseCors – FancyNancy

+0

Sì, sembra simile, ma potrebbe essere necessario includere qualche pacchetto NuGet per cors –

risposta

2

Per impostazione predefinita - Access-Control-Max-Age: i secondi sono 0 e le richieste non memorizzano nella cache.

Provare a impostare il valore massimo: (Owin selfhost). Si risolve problema con opzioni extra richiede

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

Il sotto è un commento Fancy:

capito questo con l'aiuto di post di LeftyX il 29 giu:
- Spostare questo LOC app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); al PRIMA LINEA nel metodo ConfigureAuth di Startup.Auth.cs.
- Poi, rimuovere questo LOC context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" }); dalle GrantResourceOwnerCredentials() metodo ApplicationOAuthProvide.cs.

preflight CORS-request li manifestino gestiti correttamente, e poi il requet reale passa attraverso


Grazie uomo, si salva la mia giornata.
Causa che accada per molti ragazzi, porto il tuo commento alla casella di risposta perché gli altri possano vederlo.

Non voglio votare per questo. Si prega di commentare la mia risposta invece

Grazie

+2

Grazie per aver postato questa risposta da Fancy, questo era il problema sul mio caso, stavo impostando l'opzione cors in più punti. – mini998

+1

Al punto 2, è possibile riscrivere l'intestazione utilizzando 'context.OwinContext.Response.Headers.SetValues ​​(" Access-Control-Allow-Origin ", allowedOriginStr);' – Vunb

4

Spero che questo sia in grado di aiutare qualcuno là fuori.Per me:

  • aggiungendo il app.useCors(); LOC non ha funzionato.
  • Aggiunta del app.useCors(); LOC ha lavorato per altre persone nella mia squadra.

Quindi avevo bisogno di una soluzione che potesse funzionare in tutti gli ambienti.

In definitiva quello che ho finito per fare è stato aggiunta l'intestazione e il giusto valore nel Web.config con il seguente (dove localhost: 9000 è la mia applicazione nodo che sta servendo angolare):

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

Quindi in produzione è possibile solo modificare il valore di origine per l'URL di front-end di produzione.

Se si desidera CORS abilitato per tutte le origini, modificare il valore su "*".

+1

Anche se vorrei mettere in guardia contro l'attivazione di CORS per tutte le origini per l'ovvio motivi. – James

+0

Questa è la migliore risposta! Ora è possibile configurare le trasformazioni di distribuzione Web per diversi ambienti. – TheCee

+0

@TheCee Esattamente. Nel mio caso ho impostato un Web.config.staging e una Web.config.production – James

Problemi correlati