web-dev-qa-db-fra.com

Comment fonctionne l'authentification unique (SSO)

J'essaie de comprendre la SSO. Je crois comprendre que l'authentification unique vous permet de vous connecter une fois et d'avoir accès à plusieurs applications (si vous avez des droits). Je me connecte donc à l'App A. J'établis un jeton. Comment ce jeton devient-il disponible pour l'App B, donc je n'ai pas à me reconnecter à l'App B (en supposant que l'utilisateur a des droits sur A et B)? Mes applications sont des applications AngularJs. J'accède à .Net WebAPis pour les données.

Je peux voir si je me connecte à l'application A et récupère un jeton, puis lancez l'application B à partir de l'application A en passant le jeton à l'application B. De cette façon, l'application B possède le jeton et peut envoyer au serveur pour s'assurer que l'utilisateur a accès à B. Cependant , si l'utilisateur ouvre directement un navigateur et accède à l'App B, comment sa session est-elle établie avec le jeton existant?

Si la réponse est qu'il y a un état de session sur le serveur principal, comment l'état de session correspond-il à l'utilisateur connecté dans l'application A avec la nouvelle demande pour l'application B?

Merci.

19
Tom Schreck

Eh bien, il existe certainement de nombreuses façons d'y parvenir, et cela peut être délicat. Je peux vous donner une solution à titre d'exemple:

Considérez deux applications sur des sous-domaines différents:

The Fine Corinthian Turkey Shop (turkey.example.com)
Rent a Baboon (monkey.example.com)

Ces deux applications Web souhaitent partager la connexion et organiser un troisième site Web hébergé pour leur connexion unique:

sso.example.com

Alors le flux est:

  1. Visites de Frank http://turkey.example.com/orders/12
  2. La Turquie redirige vers https://sso.example.com/login
  3. SSO présente à l'utilisateur un formulaire de connexion, valide et émet un jeton
  4. Le jeton est enregistré dans un cookie sur SSO.
  5. L'utilisateur est maintenant validé sur SSO, mais doit récupérer le jeton en Turquie.
  6. SSO stocke une combinaison de (Guid, Token, Expiration) sur le serveur, où Guid est un guid aléatoire et Expiration est quelque chose comme 30 secondes.
  7. SSO définit un cookie sécurisé sur * .example.com contenant le Guid
  8. SSO redirige vers http://turkey.example.com/orders/12
  9. La Turquie peut désormais récupérer le ticket à partir du cookie
  10. La Turquie appelle le serveur SSO et échange le ticket contre le jeton.
  11. La Turquie stocke des jetons dans le navigateur (généralement un cookie)

Imaginons maintenant que Frank veuille de jolis babouins juteux avec cette dinde:

  1. Visites de Frank: http://monkey.example.com/order-in-bulk
  2. Monkey voit que Frank n'a pas de jeton stocké et redirige vers https://sso.example.com/login
  3. SSO voit que Frank est déjà connecté car il a un jeton stocké.
  4. SSO stocke un nouveau triple (Guid, token, expiration) sur le serveur
  5. Le processus est identique à la connexion initiale le reste du chemin
43
Troels Larsen

Cependant, si l'utilisateur ouvre directement un navigateur et accède à l'App B, comment sa session est-elle établie avec le jeton existant?

Si la réponse est qu'il y a un état de session sur le serveur principal, comment l'état de session correspond-il à l'utilisateur connecté dans l'application A avec la nouvelle demande pour l'application B?

Je dirais qu'il s'agit plus de cookies et de redirections que de jetons. Les jetons sont générés une fois l'identité de l'utilisateur établie.

Ainsi, lorsque vous appuyez sur l'application B via votre navigateur, l'application B redirige votre agent utilisateur vers le serveur Auth (qui peut à son tour vous rediriger vers un site SSO).

La chose à noter est que la demande de connexion SSO est en fait une demande HTTP entre votre navigateur et le serveur SSO.

Ainsi, le cookie SSO est déjà là - car auparavant, l'application A aurait également redirigé votre agent utilisateur vers le serveur Auth/SSO où la connexion a été effectuée. Le serveur SSO pourrait alors conserver un cookie entre vous et lui.

Je peux voir si je me connecte à l'application A et récupère un jeton, puis lancez l'application B à partir de l'application A en passant le jeton à l'application B.

Je ne suis pas sûr de comprendre que l'App A passe son jeton à l'App B. Habituellement, les applications (clients Oauth 2.0) ne partagent pas de jetons. L'application B doit faire sa propre demande au serveur Auth qui (si l'utilisateur est connecté) peut ignorer la partie de connexion mais devra alors vérifier que:

  1. L'application B a des droits sur les étendues demandées et que

  2. l'utilisateur connecté a autorisé l'accès à ces étendues.

Si l'utilisateur est connecté et a déjà approuvé l'accès à la portée, tout ce traitement est transparent pour l'utilisateur final, à l'exception d'un groupe de redirections.

Cela en supposant que vous utilisez le flux de subvention implicite (j'ai remarqué que l'une de vos applications est une application angularjs).

Si vous utilisez le code, le mot de passe ou les droits d'accès client Oauth2.0, vous pouvez recevoir un jeton d'actualisation après la connexion et le consentement de l'utilisateur initial.

Le jeton d'actualisation équivaut à un accès à long terme (pour cette application uniquement) sans avoir à nouveau besoin de se connecter et de consentir à l'utilisateur final plus d'une fois.

3
iandayman

sso.example.com stocke un cookie et la même aide en matière de cookies lorsque Frank accède à monkey.example.com. Si sso.example.com estime que le cookie est trop ancien, il peut alors demander à nouveau de se connecter auth.

0
isubodh