<div dir="ltr"><div><div>Thanks for your answer.<br></div>In fact Shibboleth supports others saml nameid but in the renater federation, it only contains transient nameid. Here is a part of their doc (sorry it&#39;s in french) : <br><h2 class="sectionedit9"><a name="utilisation_des_identifiants_utilisateur_opaques" id="utilisation_des_identifiants_utilisateur_opaques">Utilisation des identifiants utilisateur opaques</a></h2>
<div class="level2">

<p>
Voir <a href="https://services.renater.fr/federation/faq/shibboleth#definition_d_un_identifiant_utilisateur_opaque" class="wikilink1" target="_self" title="federation:faq:shibboleth">la description du eduPersonTargetedID</a>
</p>

<p>
Votre application a peut-être besoin de manipuler de identifiants 
utilisateur, dont la valeur est stable d&#39;une session à l&#39;autre ; par 
exemple pour gérer les préférences utilisateur. Or, pour des raisons de 
protection des données personnelles, les fournisseurs d&#39;identités ne 
peuvent vous transmettre les identifiants des utilisateurs. Dans ce cas,
 vous pouvez demander aux fournisseurs d&#39;identités de vous communiquer 
des identifiants stables mais opaques, appelés <strong>eduPersonTargetedID</strong>. 
</p>

<p>
Vous devrez configurer le fichier <em>AAP.xml</em> de votre fournisseur de services Shibboleth comme indiqué ci-dessous :
</p>
<pre class="code">&lt;AttributeRule Name=&quot;urn:oid:1.3.6.1.4.1.5923.1.1.1.10&quot; Header=&quot;Shib-TargetedID&quot; Alias=&quot;targeted_id&quot;&gt;
   &lt;AnySite&gt;
     &lt;AnyValue/&gt;
   &lt;/AnySite&gt;
&lt;/AttributeRule&gt;</pre>

<p>
L&#39;attribut sera accessible pour l&#39;application dans l&#39;en-tête <acronym title="Hyper Text Transfer Protocol">HTTP</acronym> <strong><acronym title="Hyper Text Transfer Protocol">HTTP</acronym>_SHIB_TARGETEDID</strong> (avec Shibboleth 1.3). Le format du eduPersonTargetedID est le suivant : identifiant_IdP<strong>!</strong>identifiant_SP<strong>!</strong>identifiant_utilisateur <br></p><p><br></p><p>According to their doc, nameid are session based and not user based so if you want stable identifier, you have to ask for eduPersonTargetedID attribute !!<br></p>

</div>

I&#39;m going to have a look at UsernameTemplateMapper.<br></div>Thanks again, Jérôme.<br><div><h2 class="sectionedit10"><a name="comment_configurer_un_fournisseur_de_services_pour_qu_il_soit_reconnu_par_plusieurs_federations" id="comment_configurer_un_fournisseur_de_services_pour_qu_il_soit_reconnu_par_plusieurs_federations"></a></h2></div></div><br><div class="gmail_quote"><div dir="ltr">Le jeu. 14 janv. 2016 à 15:23, Bill Burke &lt;<a href="mailto:bburke@redhat.com">bburke@redhat.com</a>&gt; a écrit :<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  
    
  
  <div bgcolor="#FFFFFF" text="#000000">
    Shibboleth only supports transient name ids?  I find that hard to
    believe.  Remember Keycloak would just look like any other client. 
    IMO you should go that route.<br>
    <br>
    Also though,  I think you might be able to write a Broker Mapper,
    take a look at UsernameTemplateMapper.  This SPI is undocumented and
    unsupported at the moment, but I hope to change that soon.</div><div bgcolor="#FFFFFF" text="#000000"><br>
    <br>
    <div>On 1/14/2016 6:20 AM, Jérôme Blanchard
      wrote:<br>
    </div>
    <blockquote type="cite">
      <div dir="ltr">
        <div>
          <div>
            <div>
              <div>
                <div>
                  <div>Hi all, <br>
                    <br>
                  </div>
                  According to shibboleth specification, IdP of a
                  federation usually use transient NameID which makes
                  Shibboleth impossible to interface with keycloak, even
                  if we manage the Discovery Service externally in order
                  to maintain IdP list mapping between federation and
                  keycloak.<br>
                </div>
                It&#39;s really annoying for me and I&#39;m trying to
                investigate a way to solve this problem.<br>
              </div>
              In my federation, some doc say that if you need to manage
              personnal user information in your application, you have
              to rely on a dedicated attribute in order to retreive real
              user id and not the transient opaque one. In this case, an
              attribute called eduPersoneTargetedId exists and can be
              use by shibboleth. <br>
            </div>
            I am trying to patch the saml broker in order to take into
            consideration this attribute in a kind of
            attributeToNameIdMapper but I have to admit that I&#39;m lost a
            bit in the code.<br>
          </div>
          Do you think this approach is good ?<br>
          <br>
        </div>
        <div>Best regards, Jérôme.<br>
        </div>
        <br>
      </div>
      <br>
      <div class="gmail_quote">
        <div dir="ltr">Le mer. 6 janv. 2016 à 09:31, Jérôme Blanchard
          &lt;<a href="mailto:jayblanc@gmail.com" target="_blank">jayblanc@gmail.com</a>&gt;
          a écrit :<br>
        </div>
        <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
          <div dir="ltr">
            <div>
              <div>
                <div>Hi Bill, all, <br>
                  <br>
                </div>
                In the case of a transient only nameid, would it be
                possible to create a dedicated attribute mapper in order
                to use for exemple the email attribute as name
                identifier ?<br>
                <br>
              </div>
              PS : the urn:mace:shibboleth:1.0:nameIdentifier is in fact
              use in SAML v1 for request a nameid that is transient
              also... so there is no solution in this way.<br>
              <br>
            </div>
            Best regards, Jérôme.<br>
          </div>
          <br>
          <div class="gmail_quote">
            <div dir="ltr">Le mar. 5 janv. 2016 à 16:13, Bill Burke &lt;<a href="mailto:bburke@redhat.com" target="_blank"><a href="mailto:bburke@redhat.com" target="_blank">bburke@redhat.com</a></a>&gt; a écrit :<br>
            </div>
            <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">We won&#39;t
              be able to support temporary ids (transient) for awhile as
              it<br>
              requires temporary user creation which requires some
              rearchitecting.<br>
              <br>
              As for &quot;urn:mace:shibboleth:1.0:nameIdentifier&quot; if you
              spec it out in a<br>
              JIRA and it is simple enough to implement support for, we
              may be able to<br>
              get it in.<br>
              <br>
              On 1/5/2016 8:18 AM, Jérôme Blanchard wrote:<br>
              &gt; Hi Bill,<br>
              &gt;<br>
              &gt; Thanks for your answer regarding transient and
              temporary ids. I<br>
              &gt; understand the problem due to keycloak account
              creation and binding to<br>
              &gt; the IdP.<br>
              &gt; Renarter is using Shibboleth ; Is there is any work
              on shibboleth<br>
              &gt; integration for keycloak ?<br>
              &gt; If I look into the idps entities descriptors of
              renater, I found that it<br>
              &gt; uses also another nameid format based on shibboleth
              namesapce :<br>
              &gt;
&lt;md:NameIDFormat&gt;urn:mace:shibboleth:1.0:nameIdentifier&lt;/md:NameIDFormat&gt;<br>
              &gt;
&lt;md:NameIDFormat&gt;urn:oasis:names:tc:SAML:2.0:nameid-format:transient&lt;/md:NameIDFormat&gt;<br>
              &gt;<br>
              &gt; Do you think it is possible to patch the saml idp
              provider (or to create<br>
              &gt; another one dedicated to shibboleth) in order to
              integrate keycloak to<br>
              &gt; our identity federation (renater) ?<br>
              &gt;<br>
              &gt; Best whiches for this upcoming year and thanks for
              your great work<br>
              &gt; around keycloak.<br>
              &gt;<br>
              &gt; Jérôme.<br>
              &gt;<br>
              &gt;<br>
              &gt; Le mar. 22 déc. 2015 à 21:10, Bill Burke &lt;<a href="mailto:bburke@redhat.com" target="_blank"><a href="mailto:bburke@redhat.com" target="_blank">bburke@redhat.com</a></a><br>
              &gt; &lt;mailto:<a href="mailto:bburke@redhat.com" target="_blank">bburke@redhat.com</a>&gt;&gt;
              a écrit :<br>
              &gt;<br>
              &gt;     Our brokering doesn&#39;t support temporary user ids
              from the &quot;parent&quot; IDP.<br>
              &gt;        Transient Ids in SAML or temporary ids.<br>
              &gt;<br>
              &gt;     On 12/22/2015 11:46 AM, Jérôme Blanchard wrote:<br>
              &gt;      &gt; Hi,<br>
              &gt;      &gt;<br>
              &gt;      &gt; I&#39;m trying to integrate keycloak into a the
              french research<br>
              &gt;     federation<br>
              &gt;      &gt; of identity (renater) and I&#39;m facing some
              problems.<br>
              &gt;      &gt; Actually, when IdP respond to keycloak i&#39;m
              getting the following<br>
              &gt;     error :<br>
              &gt;      &gt; PL00084: Writer: Unsupported Attribute<br>
              &gt;      &gt;
              Value:org.keycloak.dom.saml.v2.assertion.NameIDType<br>
              &gt;      &gt;<br>
              &gt;      &gt; It seems that this IdP is using transient
              NameID policy only and<br>
              &gt;     using<br>
              &gt;      &gt; the unspecified field in the idp config in
              keycloak generate this<br>
              &gt;      &gt; exception as a return.<br>
              &gt;      &gt;<br>
              &gt;      &gt; Log of the keycloak server is joined.<br>
              &gt;      &gt;<br>
              &gt;      &gt; I have no idea of what happening because
              when I was using the test<br>
              &gt;      &gt; federation, everything was working but no
              I&#39;m in the production<br>
              &gt;      &gt; federation, login fails.<br>
              &gt;      &gt;<br>
              &gt;      &gt; The renater federation is using Shibolleth
              and keycloak is not<br>
              &gt;     supported<br>
              &gt;      &gt; by federation moderators so I&#39;m alone in
              the dark now...<br>
              &gt;      &gt;<br>
              &gt;      &gt; Renater provides an IdP list that I have to
              parse and<br>
              &gt;     synchronized with<br>
              &gt;      &gt; IdP in keycloak. As a return I provide a
              list of all endpoints<br>
              &gt;     for each<br>
              &gt;      &gt; keycloak registered IdP to allow federation
              IdP to answear<br>
              &gt;     correctly to<br>
              &gt;      &gt; the right endpoint. All of this is done by
              a small web app deployed<br>
              &gt;      &gt; aside keycloak and using REST API to
              synchronize all the IdP.<br>
              &gt;      &gt;<br>
              &gt;      &gt; One of the IdP entity descriptor is joined.
              As you can see, only<br>
              &gt;      &gt; transient nameid policy is supported and if
              I configure keycloak<br>
              &gt;     to use<br>
              &gt;      &gt; email or persistent, I received a response
              saying that the nameid<br>
              &gt;     is not<br>
              &gt;      &gt; supported :<br>
              &gt;      &gt;<br>
              &gt;      &gt; &lt;samlp:AuthnRequest<br>
              &gt;   
               xmlns:samlp=&quot;urn:oasis:names:tc:SAML:2.0:protocol&quot;<br>
              &gt;      &gt;
              xmlns=&quot;urn:oasis:names:tc:SAML:2.0:assertion&quot;<br>
              &gt;      &gt;<br>
              &gt;     AssertionConsumerServiceURL=&quot;<a href="https://demo-auth.ortolang.fr/auth/realms/ortolang/broker/2db5eab3f83cbaa5a322dcf3f9ac552d/endpoint" rel="noreferrer" target="_blank"><a href="https://demo-auth.ortolang.fr/auth/realms/ortolang/broker/2db5eab3f83cbaa5a322dcf3f9ac552d/endpoint" target="_blank">https://demo-auth.ortolang.fr/auth/realms/ortolang/broker/2db5eab3f83cbaa5a322dcf3f9ac552d/endpoint</a></a>&quot;<br>
              &gt;      &gt; Destination=&quot;<a href="https://janus.cnrs.fr/idp/profile/SAML2/POST/SSO" rel="noreferrer" target="_blank">https://janus.cnrs.fr/idp/profile/SAML2/POST/SSO</a>&quot;<br>
              &gt;      &gt; ForceAuthn=&quot;false&quot;
              ID=&quot;ID_c53b5759-cb97-4e95-b540-877a7a6c625d&quot;<br>
              &gt;      &gt; IsPassive=&quot;false&quot;
              IssueInstant=&quot;2015-12-22T16:13:15.987Z&quot;<br>
              &gt;      &gt;
              ProtocolBinding=&quot;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST&quot;<br>
              &gt;      &gt; Version=&quot;2.0&quot;&gt;&lt;saml:Issuer<br>
              &gt;      &gt;<br>
              &gt;   
               xmlns:saml=&quot;urn:oasis:names:tc:SAML:2.0:assertion&quot;&gt;<a href="https://demo-auth.ortolang.fr/auth/realms/ortolang" rel="noreferrer" target="_blank"><a href="https://demo-auth.ortolang.fr/auth/realms/ortolang" target="_blank">https://demo-auth.ortolang.fr/auth/realms/ortolang</a></a>&lt;/saml:Issuer&gt;&lt;samlp:NameIDPolicy<br>
              &gt;      &gt; AllowCreate=&quot;true&quot;<br>
              &gt;      &gt;<br>
              &gt;   
 Format=&quot;urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress&quot;/&gt;&lt;/samlp:AuthnRequest&gt;<br>
              &gt;      &gt;<br>
              &gt;      &gt;<br>
              &gt;      &gt; &lt;saml2p:Response
              xmlns:saml2p=&quot;urn:oasis:names:tc:SAML:2.0:protocol&quot;<br>
              &gt;      &gt;<br>
              &gt;     Destination=&quot;<a href="https://demo-auth.ortolang.fr/auth/realms/ortolang/broker/2db5eab3f83cbaa5a322dcf3f9ac552d/endpoint" rel="noreferrer" target="_blank">https://demo-auth.ortolang.fr/auth/realms/ortolang/broker/2db5eab3f83cbaa5a322dcf3f9ac552d/endpoint</a>&quot;<br>
              &gt;      &gt; ID=&quot;_9d03761957aade819b6823c35bbab278&quot;<br>
              &gt;      &gt;
              InResponseTo=&quot;ID_c53b5759-cb97-4e95-b540-877a7a6c625d&quot;<br>
              &gt;      &gt; IssueInstant=&quot;2015-12-22T16:13:16.420Z&quot;
              Version=&quot;2.0&quot;&gt;&lt;saml2:Issuer<br>
              &gt;      &gt;
              xmlns:saml2=&quot;urn:oasis:names:tc:SAML:2.0:assertion&quot;<br>
              &gt;      &gt;<br>
              &gt;   
               Format=&quot;urn:oasis:names:tc:SAML:2.0:nameid-format:entity&quot;&gt;<a href="https://janus.cnrs.fr/idp" rel="noreferrer" target="_blank"><a href="https://janus.cnrs.fr/idp" target="_blank">https://janus.cnrs.fr/idp</a></a>&lt;/saml2:Issuer&gt;&lt;saml2p:Status&gt;&lt;saml2p:StatusCode<br>
              &gt;      &gt;<br>
              &gt;   
 Value=&quot;urn:oasis:names:tc:SAML:2.0:status:Responder&quot;&gt;&lt;saml2p:StatusCode<br>
              &gt;      &gt;<br>
              &gt;   
 Value=&quot;urn:oasis:names:tc:SAML:2.0:status:InvalidNameIDPolicy&quot;/&gt;&lt;/saml2p:StatusCode&gt;&lt;saml2p:StatusMessage&gt;Required<br>
              &gt;      &gt; NameID format not<br>
              &gt;      &gt;
supported&lt;/saml2p:StatusMessage&gt;&lt;/saml2p:Status&gt;&lt;/saml2p:Response&gt;<br>
              &gt;      &gt;<br>
              &gt;      &gt;<br>
              &gt;      &gt; Any help would be gracefully appreciated.<br>
              &gt;      &gt;<br>
              &gt;      &gt; Thanks a lot, Jérôme.<br>
              &gt;      &gt;<br>
              &gt;      &gt;<br>
              &gt;      &gt;<br>
              &gt;      &gt;
              _______________________________________________<br>
              &gt;      &gt; keycloak-user mailing list<br>
              &gt;      &gt; <a href="mailto:keycloak-user@lists.jboss.org" target="_blank">keycloak-user@lists.jboss.org</a>
              &lt;mailto:<a href="mailto:keycloak-user@lists.jboss.org" target="_blank">keycloak-user@lists.jboss.org</a>&gt;<br>
              &gt;      &gt; <a href="https://lists.jboss.org/mailman/listinfo/keycloak-user" rel="noreferrer" target="_blank">https://lists.jboss.org/mailman/listinfo/keycloak-user</a><br>
              &gt;      &gt;<br>
              &gt;<br>
              &gt;     --<br>
              &gt;     Bill Burke<br>
              &gt;     JBoss, a division of Red Hat<br>
              &gt;     <a href="http://bill.burkecentral.com" rel="noreferrer" target="_blank">http://bill.burkecentral.com</a><br>
              &gt;     _______________________________________________<br>
              &gt;     keycloak-user mailing list<br>
              &gt;     <a href="mailto:keycloak-user@lists.jboss.org" target="_blank">keycloak-user@lists.jboss.org</a>
              &lt;mailto:<a href="mailto:keycloak-user@lists.jboss.org" target="_blank">keycloak-user@lists.jboss.org</a>&gt;<br>
              &gt;     <a href="https://lists.jboss.org/mailman/listinfo/keycloak-user" rel="noreferrer" target="_blank">https://lists.jboss.org/mailman/listinfo/keycloak-user</a><br>
              &gt;<br>
              <br>
              --<br>
              Bill Burke<br>
              JBoss, a division of Red Hat<br>
              <a href="http://bill.burkecentral.com" rel="noreferrer" target="_blank">http://bill.burkecentral.com</a><br>
            </blockquote>
          </div>
        </blockquote>
      </div>
    </blockquote>
    <br>
    <pre cols="72">-- 
Bill Burke
JBoss, a division of Red Hat
<a href="http://bill.burkecentral.com" target="_blank">http://bill.burkecentral.com</a></pre>
  </div></blockquote></div>