[keycloak-dev] Keycloak's SAML AuthnResponse uses wrong binding

John Dennis jdennis at redhat.com
Thu Apr 21 20:02:56 EDT 2016


On 04/16/2016 02:39 PM, Bill Burke wrote:

Sorry for the delay in responding, I was out on PTO.

> On 4/16/2016 11:23 AM, John Dennis wrote:
>> On 04/16/2016 10:04 AM, Bill Burke wrote:
>>>>> I also noticed that when I used the Web UI to examine the SP metadata
>>>>> (Installation tab of the realm client, selecting the "SAML Metadata
>>>>> SPSSODescriptor" format) that it did not match the SP metadata that
>>>>> had been loaded using the client registration service. Not only wasn't
>>>>> it the exact same metadata, but specifically it was missing several of
>>>>> the endpoints the SP declared in it's metadata. Why isn't the metadata
>>>>> the same and why did Keycloak drop essential endpoint/binding
>>>>> information?
>>
>>> Its not going to store the exact SP metadata file that was imported.
>>> Keycloak only imports SP metadata that Keycloak.  Also, the admin
>>> console is allowed to modify this imported metadata however it wants. I
>>> don't see a problem with this behavior at all.
>>
>> Here is the issue. I'm an admin and I register my SP with Keycloak.
>> But either because things are not working as expected or because I
>> simply can't remember if I updated the SP metadata in the Keycloak IdP
>> after I made a change in the SP at my end I decide to go the the
>> Keycloak Web UI and check and see what Keycloak thinks my SP metadata is.
>>
>> Instead of seeing what I believe my SP metadata should be I see
>> something completely different and that is a red flag. I wonder why
>> the metadata I load is not the same metadata Keycloak is operating on.
>> Is this the source of my problems?
>>
>> In particular I'm concerned about Keycloak dropping my SP's SAML
>> endpoints.
>>
>
> I don't think your concern is valid or a red flag.

Let me try to explain why an IdP modifying an SP's metadata is a concern.

As an illustration of the problem I've attached the SP metadata I loaded 
into Keycloak (myapp_sp_metadata.xml) and what Keycloak reports as the 
SP's metadata when queried from the client installation tab in the "SAML 
Metadata SPSSODescriptor" format. Here are where the metadata differs 
between the actual SP metadata and Keycloak's version of the SP metadata:

1) Keycloak has added a protocolSupportEnumeration for 
urn:oasis:names:tc:SAML:1.1:protocol which the SP never reported support 
for.

2) Keycloak has dropped the x509 encryption information.

3) Keycloak has dropped the SingleLogoutService using the HTTP-Redirect 
binding.

4) Keycloak has dropped the AssertionConsumerService using the 
HTTP-Artifact binding.

5) Keycloak has dropped the AssertionConsumerService using the PAOS binding.

This is clearly not what the SP reported to the IdP and I continue to 
believe this is a problem. IdP's are not permitted to alter the SP 
configuration information, rather an IdP is supposed to use the SP 
information verbatim (provided the IdP trusts the metadata).

It is common practice in SAML for admins to examine metadata. Why? 
Because most SAML problems are the result of incorrect metadata. When 
things aren't working as expected the first course of action should be 
to check the loaded metadata because the metadata drives the entire 
relationship between entities. A mistake in the metadata will certainly 
throw things into the weeds. Something not working? Check the metadata! 
If the IdP reports metadata different than provided by the SP then that 
absolutely will raise red flags.

> Please correct me if
> I'm wrong, but there is absolutely nothing within the SP metadata file
> that defines the preferred way the client wants to communicate if there
> are multiple options defined.

Actually the SP does indicate it's default AssertionConsumerService, 
it's desire for signed responses, encrypted responses, etc. in it's 
metadata. The IdP is supposed to honor them if it's able.

> Also, it is usually the IDP side that
> drives these preferences, not the client.

The IdP must respect what the SP reported.

Let me give another example. Some SAML bindings require the Destination 
attribute. But if the IdP has thrown away the binding endpoint for an SP 
how can it set the Destination attribute?

Also the IdP is supposed to validate the AssertionConsumerServiceURL 
against the value supplied in the SP metadata.

>
>> I think what you're implying is that Keycloak will parse the SP
>> metadata and retain only those parts of it which it currently
>> understands, it then stores the data it picked out of the metadata in
>> persistent storage and when asked to display the metadata Keycloak
>> will read it's internal datastore and format it as SAML metadata.
>> Correct?
>>
>
> No, it parses the SP metadata file and decides how it is going to
> interact with the SP based on best practices, i.e. POST over Redirect, etc.
>
>> If so what happens when Keycloak grows support for other SAML
>> features? Are you then going to require every SP to re-register
>> themselves so that Keycloak can parse the metadata again and rebuild
>> it's internal data structures? Shouldn't after a Keycloak upgrade
>> things just work?
>>
> If it works before Keycloak is upgraded, why wouldn't it work after?

It's not a question of features no longer working, but rather the 
inability of new features to work after an upgrade without requiring the 
all SP's to register once again so that Keycloak can read information 
which is now necessary but was formerly discarded [1].

Simple. Let's use encryption as an example. I'm guessing Keycloak does 
not currently support receiving encrypted requests because Keycloak has 
deleted the encryption information from the SP. Now lets say in a later 
release Keycloak supports encrypted requests. How are you going to 
decrypt the request if you didn't preserve the encryption parameters the 
SP provided to you in it's metadata? Are you going to require every SP 
to register themselves with Keycloak again? The same holds true for 
other features.

[1] I'm still working on the assumption Keycloak does not preserve the 
SP metadata verbatim but rather parses it and stores processed data 
instead. The SAML IdP's I'm most familiar with (Shibboleth V3 and 
Ipsilon) store the metadata and parse the stored metadata each time an 
entity is loaded. This allows them to accurately report the metadata and 
respond to bug fixes and feature upgrades when a new software version is 
installed because it's working from the canonical source description of 
the entity (e.g. the metadata).

> I really don't see the admin wanting to switch to Artifact if Keycloak
> ever ends up supporting it.    Also, IMO, it is just as likely that the
> admin defines the client in the admin console and exports the SP
> metadata to be consumed by mod-auth-mellon, than for somebody to craft
> an SP metadata file and import it into Keycloak.

Keycloak should never be in the business of generating an SP's metadata.

How can an IdP possibly know anything about an SP? IdP's cannot define 
what an SP is or how it is configured. Suggesting an IdP can know a 
prori how an SP is configured or what it's capabilities are is way 
outside normal SAML practice and is fundamentally backwards. If IdP's 
were capable of knowing enough about a SP such that it could generate 
the SP's metadata then why would metadata exchange even exist? Metadata 
and metadata exchange is a fundamental building block of SAML with it's 
own specification and exists for a reason.

Let me give a concrete example of why your suggestion that Keycloak 
would generate the metadata for a mellon SP is flawed. Up until recently 
mellon did not support ECP. ECP requires the SP export an 
AssertionConsumerService with a PAOS binding. So how is Keycloak going 
to generate the correct metadata for a mellon SP if it doesn't know what 
the version of mellon is and the versions of the libraries that mellon 
links with on the SP? Those are critical components of what mellon's 
capabilities are. So how is Keycloak as an IdP which is completely 
independent of an SP going to generate correct metadata? It's completely 
backwards to normal SAML. IdP's don't generate SP metadata, rather IdP's 
consume SP metadata. How is an IdP going to know an SP's security 
requirements? (e.g. signed responses, encrypted responses, validity 
period, etc.) How is an IdP going to know what the default service 
endpoint is or the correct ordering of endpoints? Don't forget that an 
SP may communicate with multiple IdP's thus the SP metadata must be 
valid across a set of IdP's (the other IdP's will be unknown to Keycloak).

> It really depends if
> the admin is migrating from an existing SSO solution to Keycloak or not.
>
> IMO, what the bug fixes should be are:
> * Make sure "Force POST Binding" is on by default (High Priority)
> * Don't support an import unless there are valid bindings.  i.e. if only
> artifact is listed, then abort import with an error. (High priority)
> * Add support for ACSI and ACSU (low priority)
> * Add support for Artifact Binding (very low priority, to Won't Implement)
>
>
>> So there are 2 reasons why the entire contents of original metadata
>> should be preserved:
>>
>> 1) Diagnostics, debugging, etc.
>>
>> 2) Supporting upgrades.
>>
> I completely disagree that the entire contents need to be preserved. And
> I don't see what a Keycloak upgrade has to do with anything.
>
>
>>
>>
>


-- 
John
-------------- next part --------------
A non-text attachment was scrubbed...
Name: myapp_sp_metadata.xml
Type: text/xml
Size: 3997 bytes
Desc: not available
Url : http://lists.jboss.org/pipermail/keycloak-dev/attachments/20160421/727fcb9f/attachment.xml 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: myapp_sp_metadata_from_keycloak.xml
Type: text/xml
Size: 2180 bytes
Desc: not available
Url : http://lists.jboss.org/pipermail/keycloak-dev/attachments/20160421/727fcb9f/attachment-0001.xml 


More information about the keycloak-dev mailing list