Oui, je sais ce que vous pensez - encore une autre question de la SCRO, mais cette fois, je suis perplexe.
Donc, pour commencer, le message d'erreur réel:
XMLHttpRequest ne peut pas charger http: //localhost/Foo.API/token . La valeur de l'en-tête 'Access-Control-Allow-Origin' dans la réponse ne doit pas être le caractère générique '*' lorsque le mode d'identification de la demande est 'include' . Origin ' http: // localhost: 50 ' n'est donc pas autorisé à accéder. Le mode des informations d'identification des demandes initiées par XMLHttpRequest est contrôlé par l'attribut withCredentials.
Je ne suis pas sûr de ce que l'on entend par . Le mode des informations d'identification est 'include' ?
Ainsi, lorsque j'exécute la demande dans le facteur, je ne rencontre pas cette erreur:
Mais lorsque j'accède à la même demande via mon application Web angularjs, cette erreur me laisse perplexe. Voici ma demande/réponse angualrjs. Comme vous le verrez, la réponse est OK 200
, mais je reçois toujours l'erreur CORS:
Requête du violoniste et réponse:
L'image suivante illustre la demande et la réponse du serveur Web frontal à l'API.
Donc, basé sur tous les autres articles que j'ai lus en ligne, il semble comme si je faisais ce qu'il fallait, c'est pourquoi je ne peux pas comprendre l'erreur. Enfin, voici le code que j'utilise dans angualrjs (login factory):
Implémentation CORS dans l'API - Objectifs de référence:
Méthode 1 utilisée:
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);
}
}
Méthode 2 utilisée:
public void Configuration(IAppBuilder app)
{
HttpConfiguration config = new HttpConfiguration();
ConfigureOAuth(app);
WebApiConfig.Register(config);
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
app.UseWebApi(config);
}
Merci d'avance!
Le problème provient de votre code Angular:
Lorsque withCredentials
est défini sur true, le système tente d'envoyer des informations d'identification ou des cookies avec la demande. Comme cela signifie qu'une autre origine tente potentiellement de faire des demandes authentifiées, le caractère générique ("*") n'est pas autorisé comme en-tête "Access-Control-Allow-Origin".
Pour que cela fonctionne, vous devez explicitement répondre avec l'origine qui a effectué la demande dans l'en-tête "Access-Control-Allow-Origin".
Je recommanderais de explicitement inclure dans la liste blanche les origines que vous souhaitez autoriser à faire des demandes authentifiées, car répondre simplement à l'origine à partir de la demande signifie qu'un site Web donné peut faire des appels authentifiés à votre serveur si l'utilisateur dispose d'une session valide.
J'explique ces choses dans cet article J'ai écrit il y a longtemps.
Ainsi, vous pouvez soit définir withCredentials
sur false, soit implémenter une liste blanche d'origine et répondre aux demandes CORS avec une origine valide chaque fois que des informations d'identification sont impliquées.
Personnalisation de CORS pour Angular 5 et Spring Security (solution de base Cookie)
Du côté Angular requis l'ajout de l'indicateur d'option withCredentials: true
pour le transport de cookie:
constructor(public http: HttpClient) {
}
public get(url: string = ''): Observable<any> {
return this.http.get(url, { withCredentials: true });
}
Sur Java côté serveur requis, l'ajout de CorsConfigurationSource
à la stratégie de configuration 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()...
}
}
La méthode configure(HttpSecurity http)
utilise par défaut corsConfigurationSource
pour http.cors()
Si vous utilisez un middleware CORS et que vous souhaitez envoyer withCredential boolean true, vous pouvez configurer CORS comme suit:
var cors = require ('cors');
app.use (cors ({informations d'identification: true, origine: ' http: // localhost: 50 '}));
Si cela pouvait aider, j'utilisais centrifuge avec mon application reactjs et, après avoir vérifié certains commentaires ci-dessous, j'ai consulté le fichier de bibliothèque centrifuge.js, qui, dans ma version, contenait l'extrait de code suivant:
if ('withCredentials' in xhr) {
xhr.withCredentials = true;
}
Après avoir supprimé ces trois lignes, l'application a bien fonctionné, comme prévu.
J'espère que ça aide!
Si vous utilisez .NET Core, vous devrez .AllowCredentials () lors de la configuration de CORS dans Startup.CS.
À l'intérieur de ConfigureServices
services.AddCors(o => {
o.AddPolicy("AllowSetOrigins", options =>
{
options.WithOrigins("https://localhost:xxxx");
options.AllowAnyHeader();
options.AllowAnyMethod();
options.AllowCredentials();
});
});
services.AddMvc();
Puis à l'intérieur de Configure:
app.UseCors("AllowSetOrigins");
app.UseMvc(routes =>
{
// Routing code here
});
Pour moi, c’est précisément le manque d’options.AllowCredentials () qui a causé l’erreur que vous avez mentionnée. En règle générale, pour les autres personnes ayant également des problèmes avec CORS, l'ordre est important et AddCors () doit être enregistré avant AddMVC () dans votre classe de démarrage.