È sicuro utilizzare CORS per implementare SSO?

5

Implemento SSO per integrare alcuni meccanismi di accesso Web al sistema di membri centralizzato che è il provider OAuth2. E attualmente l'autorizzazione OAuth2 funziona bene.

Tuttavia, vorrei implementare metodi di accesso molto più semplici con la chiamata AJAX. Ad esempio, l'utente ha già effettuato l'accesso al Web A e al sistema membro. Quando l'utente naviga sul Web B, il Web B deve chiamare AJAX nel sistema membro per vedere se l'utente ha effettuato l'accesso o no? Se l'utente ha effettuato l'accesso, il Web B dovrebbe mostrare all'utente la pagina di accesso.

Ho studiato alcuni articoli di OAuth2 (non riesco a trovare il link ora). Fanno tutti SSO reindirizzando direttamente al provider OAuth. Tuttavia, vorrei usare la chiamata CORS AJAX perché potrebbe fornire una migliore UX.

Ho letto un'altra discussione sul rischio di CORS e SSO: Progettazione di single-sign-on con JSONP / CORS?

Ma non riesco a capire la risposta selezionata.

There must be a control in place to prevent a malicious JavaScript client from falsifying interactions with the authorization server. If the URL is supplied as an argument within a CORS Ajax request, rather then checking the HTTP origin header, then a malicious client is permitted to lie about it's context.

L'URL potrebbe essere verificato dall'intestazione CORS Origin.

La mia opinione è che se il provider OAuth2 imposta CORS Origin correttamente, dovrebbe essere sufficiente supportare il meccanismo di login CORS AJAX. Poiché cookie e CORS non possono accedere al dominio incrociato e violano la strategia CORS Origin, non subirebbero attacchi CSRF. Devi solo preoccuparti di XSS.

Non sono molto fiducioso delle mie opinioni, è per questo che pubblico qui. Se avete qualche consiglio o trovate il mio errore, fatemelo sapere.

[Aggiorna altri dettagli]
Nel sistema membro, definirei le impostazioni CORS come questa

app.use(cors({
   origin: ["http://weba.com", "http://webb.com"],
   credentials: true,
   methods: ['GET', 'POST']
}))

app.get('/sniff', (req, res)=>{
    if(req.session.user){ res.send("user login")}
    else res.send("not login yet")
}) 

Nel webA,

xhr.withCredential = true
xhr.open("GET","http://member.com/sniff") => I can tell if user login or not.
    
posta 鄭元傑 22.05.2018 - 04:42
fonte

1 risposta

0

Oltre al vantaggio di dover gestire solo un database utente, ci sono 2 importanti vantaggi per la sicurezza dell'utilizzo di SSO:

1) L'applicazione non dovrebbe mai vedere le credenziali - rimuovendo così parte della superficie di attacco

2) poiché il browser reindirizza al sito SSO, l'utente può facilmente verificare che sta fornendo la sua password al sistema appropriato sotto i controlli appropriati (TLS, HSTS).

Ciò che proponi sembra compromettere direttamente 2 e, dato che il client verrà indirizzato all'SSO dall'applicazione, la tua proposta indebolirà indirettamente il primo vantaggio.

    
risposta data 23.05.2018 - 13:10
fonte

Leggi altre domande sui tag