2016-03-30 9 views
2

Ich erhalte einen CORS-Fehler beim Versuch, einen Zugriff mit SAML 2.0 zu authentifizieren, und ich bin bei einem vollständigen Verlust.bekomme CORS-Fehler mit SAML 2.0

Wir haben einen Backend-Webserver, der 3 verschiedene Pfade /html/js und /services bedient. Wir haben einen SAML ID-Provider definiert, die IDP-Metadaten importiert und auf der Serverseite einen Service konfiguriert, auf dem die Service-URL auf /html festgelegt wurde. Dies erzeugte einige XML-Metadaten, die im IDP-Ende der Welt registriert wurden.

Beginnend mit einem neuen Browser, gibt der Benutzer https://host:port/html ein und eine eingebundene Anmeldeseite erscheint. Der Benutzer meldet sich an, der Backend-Server gibt Sitzungscookies zurück, und die verbleibenden Anfragen werden problemlos an /js und /services weitergeleitet.

Jetzt, wenn der Benutzer den Browser schließt und wieder öffnet, werden HTML, JS/CSS aus dem Browser-Cache bedient. Die erste abgehende Anforderung von der App auf den Back-End-Server ist zu /services/a-service-name und es schlägt mit dem folgenden:

XMLHttpRequest cannot load https://fed.xxx.com/fed/idp/samlv20?SAMLRequest=some-charater-string. 
No 'Access-Control-Allow-Origin' header is present on the requested 
resource. Origin 'https://my-host:port' is therefore not allowed access. 

NETWORK ERROR; xhr= 0 error ; settings= GET /services/a-service-name <<<<<<<<<< this print is from my app 

Was soll das? Muss ich 3 Service-Provider (d. H. /html, /js, /services) auf meiner Backend-Server-Seite erstellen? Oder muss meine Anwendung SAML-Anfragen abfangen und interpretieren?

Ich werde einige Hilfe zu schätzen wissen, da ich SAML sehr neu bin.

---- EDIT 1

Basierend auf Anders Abel Antwort, wir folgenden index.html

<script> 
    if(window.location.search.length == 0){ 
    window.location = "index.html?"+Math.random(); 
    } 
</script> 

Dies zwingt einen Treffer zu dem bezeichneten SP hinzugefügt, löst SAML Dialog mit dem Bund und Kräften eine Anmeldung, es sei denn, der Benutzer ist bereits angemeldet. Danke!

Antwort

1

Wenn Sie im erneut geöffneten Browser auf die Site zugreifen, gibt es keine festgelegte Sitzung für die Anwendung. Die erste Anfrage, die den Server trifft, da Sie eine Ajax-Anfrage von JavaScript erfahren haben. Diese Anforderung löst die SAML-Anmeldesequenz aus und antwortet mit einer Weiterleitung an den Idp. An dieser Stelle taucht das Problem auf - Das idp setzt keinen CORS-Header, der es Ihrem Javascript erlaubt, es zu laden.

Aber bevor Sie losstürzen, um zu versuchen, Ihre Idp zu überzeugen, einen CORS-Header zu setzen, lesen Sie bitte weiter, denn das ist nicht, wie Sie das beheben sollten.

SAML2 wurde in alten Zeiten entworfen, bevor Ajax Anrufe bekannt waren, so dass es ziemlich schlecht zusammen damit arbeitet. Was Sie tun möchten, ist sicherzustellen, dass die HTML-Seite vom Server jedes Mal geladen wird der Benutzer die Anwendung öffnet. Auf diese Weise löst der HTML-Ladevorgang bei Bedarf den SAML2-Login-Flow aus, und alles funktioniert.

Die Lösung besteht darin, einen Cache-Header auf Ihrem HTML-Code zu setzen, so dass es nie zwischengespeichert wird.