[keycloak-user] Setting NameID to Unspecified

John Dennis jdennis at redhat.com
Tue Apr 9 16:05:46 EDT 2019


There is a bit of misinformation floating around this thread, hopefully 
I can clarify a few things.

The SAML spec defines the following NameIDFormats:

unspecified
emailAddress
X509SubjectName
WindowsDomainQualifiedName
kerberos
entity
persistent
transient

NOTE: there are some extension formats defined outside the SAML core 
spec, for example: eduPersonTargetedID

If you want to know what each of these mean refer to the saml-core 2.0 
specification.

The spec defines unspecified as: "The interpretation of the content of 
the element is left to individual implementations." But note this means 
both the relying party (e.g. SP) and the assertion provider (e.g. IdP, 
Keycloak) must agree. There would have to be mechanisms in place for 
Keycloak to extract a certain value on a per client (relying party) 
basis when the format is unspecified. To the best of my knowledge there 
is no such mechanism in Keycloak (yet).

Out of the above list Keycloak supports the following NameIDFormats:

unspecified
emailAddress
persistent
transient

With unspecified or an unsupported format Keycloak returns the user's 
username.

IMPORTANT: nameID's are NOT the same as attributes!

IMPORTANT: Traditionally relying parties that need a specific subject 
identifier are supposed to either extract that from one of the returned 
attributes or synthesize it from one or more of the returned attributes. 
This is where Keycloak's attribute mappers come into play. You can 
configure what attributes to return to facilitate this. But remember 
attributes != nameID and it's the client's job to do this.

IMPORTANT: Abusing SAML's nameID is a common problem usually born out of 
a misunderstanding of SAML concepts. The usual recommendation is to fix 
non-compliant implementations rather than introduce hacks to accommodate 
them.

Note: The Shibboleth IdP has support for per relying party custom nameID 
generation (to the best of my knowledge Keycloak has nothing like this). 
This is described here:

https://wiki.shibboleth.net/confluence/display/IDP30/CustomNameIDGenerationConfiguration 


But please note the section on the use of the unspecified format where 
it says: "We strongly urge deployers to avoid the use of this Format 
when possible. Note that in many cases when vendors claim to "require" 
its use, what they really mean (aside from "we're not interesting in 
supporting SAML properly") is that they don't care what Format you use."

You might also find this Shibboleth wiki entry on NameID useful:

https://wiki.shibboleth.net/confluence/display/CONCEPT/NameIdentifiers

FINALLY: NameID's in SAML have been a long standing source of pain, 
there is an effort to replace this part of SAML with a better mechanism, 
see this RFC:

http://docs.oasis-open.org/security/saml-subject-id-attr/v1.0/csprd02/saml-subject-id-attr-v1.0-csprd02.html

FOOTNOTE: My references to Shibboleth in the context of Keycloak are not 
meant to diminish Keycloak in any fashion whatsoever. Rather since 
Shibboleth is the oldest SAML implementation and it's architect Scott 
Cantor is a key member of the SAML committee and the fact it has 
widespread adoption means when it comes to finding any kind of decent 
documentation on SAML it's often found among the Shibboleth docs and/or 
mailing list. Keycloak has many features, including OpenID support that 
are absent in Shibboleth making Keycloak an excellent implementation 
choice among a host of other reasons to select Keycloak. No reason not 
to refer to the Shibboleth doc just to expand your conceptual 
understanding though.

On 4/9/19 2:17 PM, Aaron Echols wrote:
> Wouldn't you just need to add a mapper under your client to map to
> username, then set SAML Attribute NameFormat to unspecified there? Maybe
> I'm wrong, but that seems like the correct way to do this per client.
> --
> Aaron Echols
> 
> On Mon, Apr 8, 2019 at 5:07 AM Ron Alleva <ronallevatech at gmail.com> wrote:
> 
>> Hi Manuel,
>>
>> Thanks for replying. That url does help me understand the difference
>> between the different identifier types.
>>
>> However, the client I'm working with has it set in their IdP that the SAML
>> message sent to it should contain one of the user's attributes (specific
>> string of numbers, like a special user id) in the NameID field, with a
>> format of unspecified. In Keycloak (at least 4.4 and 5.0, that I checked),
>> there's no option for "unspecified" in the NameID format setting, or a way
>> to remove it altogether to default to unspecified.
>>
>> Is this something Keycloak can support out of the box? Is it something I
>> can accomplish with a JavaScript protocol mapper, or do I have to code my
>> own mapper for that purpose?
>>
>> Thanks,
>>
>> Ron
>>
>> On Mon, Apr 8, 2019, 05:03 Manuel Waltschek <
>> manuel.waltschek at prisma-solutions.at> wrote:
>>
>>> Hello Ron,
>>>
>>> maybe this url will help you:
>>>
>> https://stackoverflow.com/questions/11693297/what-are-the-different-nameid-format-used-for
>>>
>>> As the answer states unspecified can be used and it purely depends on the
>>> entities implementation on their own wish. So as I understand you have to
>>> send the nameId in some format, but have to decide for one format to send
>>> the client on keycloak site. Unspecified often defaults to the
>>> implementation specific default settings.
>>>
>>> Regards,
>>>
>>> Manuel
>>>
>>>
>>>
>>> -----Ursprüngliche Nachricht-----
>>> Von: keycloak-user-bounces at lists.jboss.org <
>>> keycloak-user-bounces at lists.jboss.org> Im Auftrag von Ron Alleva
>>> Gesendet: Montag, 08. April 2019 04:52
>>> An: keycloak-user at lists.jboss.org
>>> Betreff: [keycloak-user] Setting NameID to Unspecified
>>>
>>> Hi all,
>>>
>>> I'm working with a particular IdP client, and they have requested that I
>>> set the NameID field to an attribute on the user that is neither username
>>> or email, and that it must be in the "unspecified" format.
>>>
>>> I've been trying a bunch of different configuration options to get it
>>> work, but none seem to do what I need it to do. I know about
>>> "saml.persistent.name.id.for.$clientId" on a user, and I've been trying
>>> variations on that.
>>>
>>> Does anyone have any guidance on how to have a attribute of the user be
>>> populated in the NameID field, with a format of "unspecified"?
>>>
>>> Thanks,
>>> Ron
>>> _______________________________________________
>>> keycloak-user mailing list
>>> keycloak-user at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/keycloak-user
>>>
>> _______________________________________________
>> keycloak-user mailing list
>> keycloak-user at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/keycloak-user
> _______________________________________________
> keycloak-user mailing list
> keycloak-user at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/keycloak-user
> 


-- 
John Dennis


More information about the keycloak-user mailing list