CORS: la modalità delle credenziali è "include"


100

Sì, so cosa stai pensando - ancora un'altra domanda CORS, ma questa volta sono perplesso.

Quindi, per iniziare, il messaggio di errore effettivo:

XMLHttpRequest non può caricare http: //localhost/Foo.API/token . Il valore dell'intestazione "Access-Control-Allow-Origin" nella risposta non deve essere il carattere jolly "*" quando la modalità delle credenziali della richiesta è "include" . L'accesso all'origine " http: // localhost: 5000 " non è pertanto consentito. La modalità delle credenziali delle richieste avviate da XMLHttpRequest è controllata dall'attributo withCredentials.

Non sono sicuro che cosa si intende per modalità credenziali sia "include" ?

Così, quando mi esibisco la richiesta in postino, provo nessun tale errore:

inserisci qui la descrizione dell'immagine

Ma quando accedo alla stessa richiesta tramite la mia app web angularjs, sono perplesso da questo errore. Ecco la mia richiesta / risposta angualrjs. Come vedrai la risposta è OK 200, ma ricevo ancora l'errore CORS:

Richiesta e risposta di Fiddler:

L'immagine seguente mostra la richiesta e la risposta dal front-end Web all'API

Violinista

Quindi, in base a tutti gli altri post che ho letto online, sembra che io stia facendo la cosa giusta, ecco perché non riesco a capire l'errore. Infine, ecco il codice che utilizzo all'interno di angualrjs (login factory):

inserisci qui la descrizione dell'immagine

Implementazione di CORS nell'API - Scopi di riferimento:

Metodo 1 utilizzato:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        EnableCrossSiteRequests(config);
    }

    private static void EnableCrossSiteRequests(HttpConfiguration config)
    {
        var cors = new EnableCorsAttribute("*", "*", "*")
        {
            SupportsCredentials = true
        };
        config.EnableCors(cors);
    }
}

Metodo 2 utilizzato:

public void Configuration(IAppBuilder app)
{
    HttpConfiguration config = new HttpConfiguration();

    ConfigureOAuth(app);

    WebApiConfig.Register(config);
    app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
    app.UseWebApi(config);

}

Molte grazie in anticipo!


belle foto, di cosa sono? Per rispondere alla tua domanda, se includi l'autenticazione, la risposta access-control-allow-origin deve essere l'host di origine (pagina del browser), non può essere *- quindi, il lato server sta facendo CORS sbagliato - oh, e il postino funziona perché non è una richiesta di origine incrociata
Jaromanda X

@JaromandaX, grazie per la risposta. Le immagini dimostrano la richiesta / risposta e dimostrano il passaggio delle intestazioni. Stai facendo la domanda, ovviamente afferma che non ha
Richard Bailey

Il mio commento dovrebbe essere tutto ciò che devi sapere - non
c'era

Così recentemente ho deciso di abbandonare i cookie sulla mia API web e di utilizzare piuttosto i token. Quando ho utilizzato i cookie, il mio CORS funziona senza problemi. Quindi sto lottando per capire come CORS non sia implementato correttamente sul lato server
Richard Bailey

1
se includi l'autenticazione, la access-control-allow-originrisposta deve essere l'host di origine (pagina del browser), non può essere*
Jaromanda X

Risposte:


103

Il problema deriva dal tuo codice Angular:

Quando withCredentialsè impostato su true, sta tentando di inviare credenziali o cookie insieme alla richiesta. Poiché ciò significa che un'altra origine sta tentando di eseguire richieste autenticate, il carattere jolly ("*") non è consentito come intestazione "Access-Control-Allow-Origin".

Dovresti rispondere esplicitamente con l'origine che ha effettuato la richiesta nell'intestazione "Access-Control-Allow-Origin" per fare in modo che funzioni.

Suggerirei di inserire esplicitamente nella whitelist le origini a cui si desidera consentire di effettuare richieste autenticate, perché semplicemente rispondere con l'origine dalla richiesta significa che qualsiasi sito Web può effettuare chiamate autenticate al proprio backend se l'utente ha una sessione valida.

Spiego queste cose in questo articolo che ho scritto tempo fa.

Quindi puoi impostare withCredentialssu false o implementare una whitelist di origine e rispondere alle richieste CORS con un'origine valida ogni volta che sono coinvolte le credenziali


3
Sto lavorando all'applicazione Angular 5 con TypeScript. Devo dare withCredentials come true altrimenti riceverò un'eccezione di autorizzazione non riuscita. Come risolvere questo problema con Credenziali: true
Ziggler

@Ziggler ho avuto la stessa situazione. Trovi soluzioni?
Pavel

@Ziggler ho multato la soluzione vedi la mia risposta.
Pavel

1
Ricevo ancora questo errore quando utilizzo WithCredentials = TRUE e Access-Control-Allow-Origin = [' localhost: 4200'] e NON sto usando star * quindi il messaggio di errore non ha più senso. MESSAGGIO DI ERRORE: "La risposta alla richiesta di verifica preliminare non supera il controllo di controllo dell'accesso: il valore dell'intestazione" Access-Control-Allow-Origin "nella risposta non deve essere il carattere jolly * quando la modalità delle credenziali della richiesta è" include ". Origine " localhost: 4200 " non è pertanto consentito l'accesso. La modalità delle credenziali delle richieste avviate da XMLHttpRequest è controllata dall'attributo withCredentials. "
mruanova

@mruanova sei sicuro che l'intestazione Access-Control-Allow-Origin sia impostata correttamente nella richiesta? Sembra che qualcosa venga inviato con un carattere jolly da qualche parte
geekonaut

14

Se stai utilizzando il middleware CORS e desideri inviare un valore withCredentialsbooleano true, puoi configurare CORS in questo modo:

var cors = require('cors');    
app.use(cors({credentials: true, origin: 'http://localhost:5000'}));

"


3
Risposta salvavita. +1 per quello
Nisharg Shah,

1
Ho cercato di risolvere questo problema tutto il giorno. Sei il salvatore!
Hasan Sefa Ozalp

11

Personalizzazione di CORS per Angular 5 e Spring Security (soluzione di base dei cookie)

Sul lato angolare è richiesta l'aggiunta di flag di opzione withCredentials: trueper il trasporto dei cookie:

constructor(public http: HttpClient) {
}

public get(url: string = ''): Observable<any> {
    return this.http.get(url, { withCredentials: true });
}

Sul lato server Java è richiesta l'aggiunta CorsConfigurationSourceper la configurazione dei criteri CORS:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        // This Origin header you can see that in Network tab
        configuration.setAllowedOrigins(Arrays.asList("http:/url_1", "http:/url_2")); 
        configuration.setAllowedMethods(Arrays.asList("GET","POST"));
        configuration.setAllowedHeaders(Arrays.asList("content-type"));
        configuration.setAllowCredentials(true);
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors().and()...
    }
}

Il metodo configure(HttpSecurity http)predefinito utilizzerà corsConfigurationSourceperhttp.cors()


1

Se aiuta, stavo usando centrifuge con la mia app reactjs e, dopo aver controllato alcuni commenti di seguito, ho guardato il file della libreria centrifuge.js, che nella mia versione aveva il seguente frammento di codice:

if ('withCredentials' in xhr) {
 xhr.withCredentials = true;
}

Dopo aver rimosso queste tre linee, l'app ha funzionato correttamente, come previsto.

Spero che sia d'aiuto!


Grazie ... questo mi ha fatto risparmiare un sacco di tempo! :)
pavan kumar chaitanya

1

Se stai usando .NET Core, dovrai usare .AllowCredentials () durante la configurazione di CORS in Startup.CS.

All'interno di ConfigureServices

services.AddCors(o => {
    o.AddPolicy("AllowSetOrigins", options =>
    {
        options.WithOrigins("https://localhost:xxxx");
        options.AllowAnyHeader();
        options.AllowAnyMethod();
        options.AllowCredentials();
    });
});

services.AddMvc();

Quindi all'interno di Configure:

app.UseCors("AllowSetOrigins");
app.UseMvc(routes =>
    {
        // Routing code here
    });

Per me, erano specificamente solo le opzioni mancanti.AllowCredentials () che ha causato l'errore che hai menzionato. Come nota a margine in generale anche per gli altri che hanno problemi con CORS, l'ordine è importante e AddCors () deve essere registrato prima di AddMVC () all'interno della classe di avvio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.