web-dev-qa-db-fra.com

Est-il sécurisé d'utiliser Cors pour mettre en œuvre SSO?

Je mettez en place SSO pour intégrer un mécanisme de connexion Web au système Membres centralisé qui est le fournisseur OAuth2. Et Actuellement, l'autorisation de l'OAUTH2 fonctionne bien.

Cependant, je voudrais mettre en œuvre des méthodes de connexion beaucoup plus en douceur par AJAX appel. Par exemple, l'utilisateur est déjà connecté à Web A et Système de membre. Lorsque l'utilisateur navigue à Web B, le Web B devrait appeler AJAX au système de membre pour voir si l'utilisateur s'est connecté ou non? Si l'utilisateur est connecté, le Web B doit indiquer à l'utilisateur la page connectée.

J'ai étudié une partie de l'article OAuth2 (je ne trouve pas de lien maintenant). Ils font tous SSO en redirect à OAuth fournisseur directement. Cependant, j'aimerais utiliser Cors AJAX appel car il pourrait fournir une meilleure ux.

J'ai lu une autre discussion sur le risque de CORS et de SSO: concevoir une connexion unique avec JSONP/CORS?

Mais je ne peux pas comprendre la réponse sélectionnée.

Il doit y avoir un contrôle en place pour empêcher un client javascript malveillant de falsifier les interactions avec le serveur d'autorisation. Si l'URL est fournie sous forme d'argument dans une requête Ajax Cors, vérifiez plutôt l'en-tête HTTP Origin, un client malveillant est autorisé à mentir à ce sujet.

L'URL pourrait être vérifiée par l'origine de l'en-tête Cors.

Mon opinion est que si le fournisseur OAuth2 définisse correctement l'origine de Cors, il convient d'aller de bien à prendre en charge Cors AJAX. Parce que Cookie et CORS ne peuvent pas accéder par la stratégie de domaine croisé et enfreignent la stratégie d'origine CORS, ce ne serait pas souffrir d'attaque du CSRF. Il suffit de s'inquiéter des XSS.

Je ne suis pas très confiant de mes opinions, c'est pourquoi je pose ici. Si vous avez des conseils ou trouvez mon erreur, merci de me le faire savoir.

[Mettre à jour plus de détails]
[.____] Dans le système membre, je définirais des paramètres de Cors comme celui-ci

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")
}) 

Dans le Weba,

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

Au-delà de l'avantage de ne pas avoir à traiter avec une base de données utilisateur, il existe 2 avantages sociaux importants de l'utilisation de SSO:

1) la demande ne doit jamais voir les informations d'identification - supprimant ainsi une partie de la surface d'attaque

2) Depuis que le navigateur redirige vers le site SSO, l'utilisateur peut facilement vérifier qu'ils fournissent leur mot de passe au système approprié sous des commandes appropriées (TLS, HST).

Ce que vous proposez semble directement saper 2 et, étant donné que le client sera dirigé vers la SSO par la demande, votre proposition sape indirectement le premier avantage.

1
symcbean