Mon entreprise développe actuellement une Java. Quelques-uns de nos clients ont des serveurs SAML internes (fournisseurs d'identité?) Et ont demandé que nous nous intégrions à eux. Alors récemment, j'ai lu sur et en jouant avec OpenAM. Après environ 3 jours, j'ai une compréhension générale, mais il y a encore des lacunes dans mes connaissances. J'espère que quelqu'un pourra éclaircir cela pour moi.
Voici donc comment j'imagine le flux de travail d'un utilisateur qui se connecte.
Définissons le serveur SAML de nos clients comme https://their.samlserver.com . Ainsi, un utilisateur vient à notre application Web pour une ressource qui est protégée. Disons que l'URL est http://my.app.com/something .
Donc, si j'ai raison, my.app.com est ce que SAML définit comme un fournisseur de services . Notre application se rend compte que cet utilisateur doit se connecter. Nous présentons ensuite une page comme celle-ci à l'utilisateur ...
<script>JQuery Script to auto submit this form on ready</script>
<form method="post" action="https://their.samlserver.com/Post/Servlet">
<input type="hidden" name="SAMLRequest" value="someBase64Data" />
<input type="submit" value="Submit" />
</form>
Et cela someBase64Data
devrait être base64
version codée de cette ...
<samlp:AuthnRequest
xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
ID="identifier_1"
Version="2.0"
IssueInstant="2004-12-05T09:21:59Z"
AssertionConsumerServiceIndex="0">
<saml:Issuer>http://my.app.com</saml:Issuer>
<samlp:NameIDPolicy
AllowCreate="true"
Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/>
</samlp:AuthnRequest>
Donc mes deux premières questions.
Quelle est la valeur [~ # ~] id [~ # ~] supposée être?
Et pourquoi puis-je me déclarer émetteur ?
Le fournisseur d'identité est-il au courant de moi? Peut-être que c'est Cercle de confiance que j'ai vu sur OpenAM . Et s'il me connaît, comment le sait-il et que doit-il savoir?
Ainsi, après que l'utilisateur a transmis cette page, ils sont dirigés vers une page fournie par l'IDP https://their.samlserver.com . Ils s'authentifient sur cette page et l'IDP fait sa magie pour valider l'authentification et rechercher l'utilisateur. Une fois l'authentification réussie, l'IDP renvoie un <samlp:Response>
défini ici .
Encore quelques questions.
Tout d'abord, comment fonctionne le <samlp:Response>
revenir à mon application web pour pouvoir la vérifier?
Et que dois-je rechercher dans cette réponse pour valider qu'elle a réussi? À quoi ressemble un échec?
Nous utilisons actuellement l'adresse e-mail (LDAP) pour identifier les utilisateurs, nous allons donc probablement récupérer cela dans la réponse et l'utiliser de la même manière que maintenant. Autre chose que je devrais garder à l'esprit dans cette réponse?
Maintenant que nous avons vérifié la validité de cette réponse, nous pouvons accorder à l'utilisateur une session comme nous le faisons actuellement. Mais quand ils veulent se déconnecter, existe-t-il un flux de travail pour cela? Dois-je informer l'IDP du départ de l'utilisateur?
Et enfin, il y a quelques sujets qui ont été évoqués dans ma lecture et je ne sais pas comment ils s'intègrent dans ce flux de travail. Ce sont Cercle de confiance , Jetons , et Artefacts .
Merci pour toute aide à tous. J'ai trouvé beaucoup d'informations ces derniers jours, et il est possible que je puisse les rassembler après avoir joué un peu plus. Mais je n'ai pas encore trouvé d'article de workflow simple "Voici la publication". C'est peut-être parce que je me trompe sur la façon dont cela fonctionne. C'est peut-être parce que ce n'est pas si populaire. Mais je voulais vraiment m'assurer d'avoir le flux de travail afin de ne pas manquer une étape cruciale dans quelque chose d'aussi important que l'authentification des utilisateurs.
En réponse à vos questions spécifiques:
1.) Quelle est la valeur "ID" supposée être?
Le mécanisme par lequel une entité système SAML garantit que l'identifiant est unique est laissé à l'implémentation. Dans le cas où une technique aléatoire ou pseudo-aléatoire est utilisée, la probabilité que deux identifiants choisis au hasard soient identiques DOIT être inférieure ou égale à 2 ^ -128 et DEVRAIT être inférieure ou égale à 2 ^ -160 de longueur. Cette exigence PEUT être satisfaite en codant une valeur choisie au hasard entre 128 et 160 bits.
2.) Comment l'IDP vous connaît-il?
.) Où est la réponse et que vérifier?
4.) Qu'en est-il de la déconnexion?
Donc, en bref - cela peut être assez complexe à mettre en œuvre à partir de zéro. Il est préférable d'utiliser des bibliothèques et/ou des produits éprouvés comme le suggère Ian. Des entreprises comme la sienne ont investi des centaines d'heures de développement pour mettre en œuvre conformément aux spécifications et tester l'interopérabilité avec d'autres fournisseurs.
Si vous essayez simplement de définir une seule application Java en tant que fournisseur de services, vous devriez envisager d'utiliser un Fedlet depuis Oracle (en tant que autonome) ou - ForgeRock (fourni avec OpenAM). Le Fedlet ForgeRock a quelques problèmes d'interaction avec Shibboleth 2.2.1 en tant que fournisseur d'identité, mais je trouve qu'il est un peu plus simple à configurer et plus informatif.
Chacun contient des instructions explicites contenues dans le README pour vous aider à déployer. Une fois le Fedlet configuré et communiquant avec l'IDP, la page de réussite vous montre tout le code dont vous avez besoin pour intégrer l'authentification unique fédérée dans votre application. Il fait le travail d'arrière-plan de l'envoi et de la réception des demandes et réponses Authn.
La réponse de Scott répond assez bien aux questions que vous vous posiez, mais je pense qu'essayer d'écrire vous-même du code qui génère le SAML réinvente la roue. Le Fedlet a été conçu précisément dans ce cas d'utilisation.