<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">
<div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">
<div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">
<div class=""><br class="">
</div>
<div class="">Thanks for taking the time to comment.</div>
<div class=""><br class="">
<div>
<blockquote type="cite" class="">First question, how did you get twitter handle @erlang ?</blockquote>
<div><br class="">
</div>
<div>I registered it a long time ago. At the university I studied queuing theory, and it was a tribute to <a href="https://en.wikipedia.org/wiki/Agner_Krarup_Erlang" class="">https://en.wikipedia.org/wiki/Agner_Krarup_Erlang</a> </div>
<br class="">
<blockquote type="cite" class="">
<div class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">Here
are some comments, just prima facie:</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class="">
<br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class="">
<span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">1.
I like the idea to leverage Webfinger. One of my core concerns about he current OIDC federation draft is that it's too static in a day and age when we're all using lots of API’s.
</span></div>
</blockquote>
<br class="">
<blockquote type="cite" class="">
<div class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">And
WebFinger is already used by OP's that support dynamic configuration, so why not use it?</span></div>
</blockquote>
<div><br class="">
</div>
<div>Exactly.</div>
<br class="">
<blockquote type="cite" class="">
<div class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">But
one question I have is public clients, for example a javascript application running in the browser can't host a Webfinger endpoint.</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class="">
</div>
</blockquote>
<div><br class="">
</div>
<div>You are right, the browser cannot host a webfinger endpoint, nor does it have to.</div>
<div><br class="">
</div>
<div>Native apps and SPAs have in common that they run on the device of the end user. Typically all users of an application will share the same client_id and metadata, and the app does not hold its own credentials, but instead rely on some sort of control of
the redirect_uri value, either through the domain where the SPA is hosted or through a custom scheme such as mycoolapp:// registered through apple or google.</div>
<div><br class="">
</div>
<div>There is no restrictions on where the SPA entity statement of a client is hosted. The requirement instead is that the entity statement can be resolved from the client_id through the use of webfinger. The entity that services the entity statement will be
reflected in the client_id, but there is no required relationship between the client_id and the redirect_uri. If the app has an application provider that hosts the SPA app, the application provider can host the webfinger server and serve the entity statment
of the shared statement of all instances of that app. Alternatively the federation may offer to host entity statements for the client. </div>
<div><br class="">
</div>
<div>Such an entity statement would typically be like this:</div>
<div><br class="">
</div>
<div>
<div>{</div>
<div> "iss": "<a href="https://feide.no/federation" class="">https://feide.no/federation</a>",</div>
<div> "sub": "<a href="https://feide.no/application/394747" class="">https://feide.no/application/394747</a>",</div>
<div> "metadata": {</div>
<div> "openidClient": {</div>
<div> "redirect_uris": [</div>
<div> "coolapp://"</div>
<div> ]</div>
<div> }</div>
<div> },</div>
<div> "jwks": null</div>
<div>}</div>
<div><br class="">
</div>
<div><br class="">
</div>
<div>I think that trends and new requirements would make it interesting to discuss the ability for SPAs and native apps to establish their own credentials (self generated key pairs). This will result in separate client_ids for each deployent, while the redirect_uris
would be shared. How we build the federated infrastructure have consequences for how easy it would be to build and how smooth this will run.</div>
<div><br class="">
</div>
</div>
<blockquote type="cite" class="">
<div class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">2.
Wouldn't it be better for the client to present it's metadata during dynamic client registration, rather then requiring the OP to call back to the RP's Webfinger URL at authentication time?</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class="">
</div>
</blockquote>
<div><br class="">
</div>
<div>No.</div>
<div><br class="">
</div>
<div>* Dynamic client registration derives from the platform centric paradigm, and has no obvious role in the distributed / federation approach.</div>
<div>* We would like to be kind with the clients, loading the responsibility of fetching all the needed entity statements from the federation and pushing them to the provider is unncessary and adds complexity to the client.</div>
<div>* Obviously we need to target the concern of delays during the authentication flow. There need to be caching involved. </div>
<br class="">
<blockquote type="cite" class="">
<div class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">3.
Are you also proposing the use of OP,RP metadata for signing_keys, signing_keys_uri, and signed_jwks_uri ? Another federation challenge is that key rotation for the jwks_uri happens frequently if you are following guidelines for best practices (every two days).</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class="">
</div>
</blockquote>
<div><br class="">
</div>
<div>In the current draft, the entity statement contains a jwks claim that is protocol independent.</div>
<div>When a federation states something about a service provider, the jwks claim represent the public key the service provides uses to sign statements about itself</div>
<div>When the service provider offers its self issued statement using webfinger, it signs a statement that can be validated with that pubic key. However the statement that the service provider makes about it self can also include a new public key that can be
used in OpenID message exchange signing requests. If the service provider to do that will use the protocol agnostic jwks claim or it should add a jwks in the openid client metadata or if it should be allowed to use jwks_uri for yet another indirection can
be a discussion on its own. In general I think we need to be careful and not add too many options of how to do things (or too many layers of indirection). This is where SAML failed.</div>
<div><br class="">
</div>
<div>When it comes to key rotation, JWT Federation should be able to support that perfectly. A client or provider can easily generate new keys and update their own self-issued statement.</div>
<div><br class="">
</div>
<div>Currently OpenID Core [10.1.1] promotes rotation of keys using jwks_uri. AFAIK jwks_uri drops back to rely on TLS only, and should be completely avoided in the federation use cases. In fact I even think that providers that would like to do key rotatation
will benefit from JWT federation even if it does not need the federation part.</div>
<br class="">
<blockquote type="cite" class="">
<div class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">4.
What about metadata for the federation itself? Perhaps the federation wants to publish certain guidelines, like what are the SAML attributes it recommends its participants to support? For example, InCommon recommends use of eduPerson.</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class="">
</div>
</blockquote>
<div><br class="">
</div>
<div>There are some properties that a federation would like to enforce all leaf nodes (clients or providers) derived from it. These properties can be like restrictions on LoA or attributes that can be trusted. These properties would go into the metadata claim
that is merged with the complete trust chain (similar to the currenct openid connect federation draft).</div>
<div><br class="">
</div>
<div>JWT Federation also allows for any entity to issue statements about themselves. In a normal authentication flow, a provider would not usually fetch Feides statement about it self, but instead fetch Feides statement about a univerity or service provider.
Information in Feides statement about itself would therefor not impact the technical trust between the two entities.</div>
<div><br class="">
</div>
<div>I think it would be useful to define a separate entity type of ‘federation’ with a metadata schema allowing legal and technical contacts, urls to policy documents, documentation. This could also be the most appropriate place to add links to provider discovery
services (APIs for list of universities, like we use in educational federations). The infr</div>
<div><br class="">
</div>
<div>The content of this self issued federation statement can be trustred using the same validation chain.</div>
<div><br class="">
</div>
<br class="">
<blockquote type="cite" class="">
<div class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">5.
How would a client register with the federation to get that persistent identifier? Or is that out of scope of your proposal?</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class="">
</div>
</blockquote>
<div><br class="">
</div>
<div>I’d say that it is out of scope.</div>
<div><br class="">
</div>
<div>Today most federations manage client registration by providing Developer/Admin Dashboard where administrator end-users authenticates and copy and paste SAML metadata into a form.</div>
<div><br class="">
</div>
<div>I foresee a first generation of OpenID Connect Developer dashboards, where the user enters the client_id into a form. The dashboard then fetches the self issued entity statements using WebFinger, and asks the user to verify that the public key matches.
Next the admin adds the entityid of the federation into the client config, and the client should be ready to work with providers in the federation.</div>
<div><br class="">
</div>
<div>I also expect there to be a next generation where the developer dashboards are replaced with APIs, expecting Oauth tokens with an authenticated administrator. This allows client registration to be tightly integrated with CI for both production and test
builds, and better follows the application lifecycles.</div>
<div><br class="">
</div>
<br class="">
<blockquote type="cite" class="">
<div class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">6.
Did you go through the inter-federation use case? Is the data duplicated? Or does one federation refer back to the other federation?</span></div>
</blockquote>
</div>
<br class="">
<div class="">Is there a separate document describing the inter-federation use case? Please send me the link.</div>
<div class=""><br class="">
</div>
<div class="">Trust is established in a tree structure, and a trust chain is one path trough that tree. Inter-federation is just another item on the chain. Nothing special about it.</div>
<div class=""><br class="">
</div>
<div class="">The challenge is specifying metadata semantics that allow a federation to express the exact delegated trust how it is intended. A federation that delegates trust with no restrictions would be more or less an empty metadata object as part of the
chain/tree.</div>
<div class=""><br class="">
</div>
<div class="">
<div><br class="Apple-interchange-newline">
Andreas Åkre Solberg</div>
<div>Senior Technical Architect</div>
<div>UNINETT – <a href="https://uninett.no" class="">https://uninett.no</a> </div>
<div><a href="https://www.linkedin.com/in/andreassolberg/" class="">https://www.linkedin.com/in/andreassolberg/</a></div>
<div><br class="">
</div>
<div class=""><br class="">
</div>
</div>
</div>
</div>
</div>
</body>
</html>