<html class="apple-mail-supports-explicit-dark-mode"><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto">FWIW, everything in the Microsoft cloud (azure, teams, o365 apps, etc) is a single RP to an IDP like Okta.  Every new product, feature, app, service reuses the same federation relationship.   It’s a big challenge for the enterprise as it’s a single policy for everything and once you SSO all bets are off. <div><br></div><div><br><div><br></div><div><br id="lineBreakAtBeginningOfSignature"><div dir="ltr">Sent via thumbs on glass</div><div dir="ltr"><br><blockquote type="cite">On Oct 10, 2025, at 7:22 PM, Ethan Heilman via Openid-specs-ab <openid-specs-ab@lists.openid.net> wrote:<br><br></blockquote></div><blockquote type="cite"><div dir="ltr"><div dir="ltr"><div dir="auto"><div dir="auto">Thanks for your answer Aaron, I think I understand your perspective better. This sounds like an argument for benefits of OP Commands and for RPs to robustly support OP commands.<br><br>> the team realizes they are getting signed ID tokens from the IDP, and start sending the ID tokens to the new meeting note app to log in. since it's a separate app, the meeting notes app creates its own session when presented with an ID token</div><div><br>Key binding/DPoP helps a little here because the todo app can't simply replay the ID Token to the note taking app as it can without key binding.<br><br>> 

Of course this is not best practice, as the meeting notes app should have been configured as a second OIDC client in the IDP. <br><br>Instead of solving this problem by creating a separate audience/client-ids, why not have the todo list and note app be a single RP and handle OP commands across todos and notes? For example when I SSO into gitlab with OIDC, I can use all the gitlab services without having to separately sign into gitlab operations, gitlab todos, gitlab issues, gitlab workspaces etc...</div><div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Oct 10, 2025, 13:12 Aaron Parecki <<a href="mailto:aaron@parecki.com" rel="noreferrer" target="_blank">aaron@parecki.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">So this isn't the scenario I'm talking about, this is an expected scenario. I'm talking about an unexpected scenario like the following:<div><br></div><div>- an internal team builds a custom app to track todo list items and they configure it for SSO with the company IDP. The admin create the client ID and assign that team to the app</div><div>- the team builds a new custom app to collect meeting notes</div><div>- the team realizes they are getting signed ID tokens from the IDP, and start sending the ID tokens to the new meeting note app to log in. since it's a separate app, the meeting notes app creates its own session when presented with an ID token</div><div><br></div><div>Now the admins at the company have no idea that this second meeting notes app exists. Let's say they do have some revocation mechanism set up such as OP Commands, the IDP would send the command to the todo app. But the IDP didn't know about the meeting notes app so doesn't even know it needs to tell that app to revoke its sessions too.</div><div><br></div><div>Of course this is not best practice, as the meeting notes app should have been configured as a second OIDC client in the IDP. But this is exactly the kind of thing that happens when the audience of the ID token is ignored or "expanded" to include unrelated services.</div><div><br></div><div>This example is relatively trivial, but you can imagine it gets worse and more complicated when the ID tokens are expanded to uses beyond establishing web sessions, such as establishing SSH sessions or signing git commits.</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Oct 10, 2025 at 6:10 AM Ethan Heilman <<a href="mailto:eth3rs@gmail.com" rel="noreferrer noreferrer" target="_blank">eth3rs@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">> When an ID token is sent by an RP to some other unrelated component, while the other thing can validate the ID token, the IdP doesn't know it has been sent elsewhere, so doesn't know it might need to clean things up over there.<br><br>I want to understand your perspective better here. Can you give a concrete example comparing:<div>-  a public OIDC client used in a webapp <br>- vs. a public OIDC client used by two webapps where both choose to trust the same audience?<br><br>What does it see or learn in the first case that it can't see or learn in the second case?<br><br>What actions does the IdP take in the first case that it can't take in the second case? <br><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Oct 9, 2025 at 7:29 PM Aaron Parecki <<a href="mailto:aaron@parecki.com" rel="noreferrer noreferrer" target="_blank">aaron@parecki.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">The question isn't _how_ to revoke. The problem is the IdP doesn't necessarily know this is happening in the first place, so doesn't even know it needs to revoke that access.<div><br></div><div>When an ID token is sent by an RP to some other unrelated component, while the other thing can validate the ID token, the IdP doesn't know it has been sent elsewhere, so doesn't know it might need to clean things up over there. This is precisely what OpenPubKey seems to suggest with language such as this:</div><div><br></div><div>> Alice can then reveal this ID Token to a third party to prove that she is <a href="mailto:Alice@gmail.com" rel="noreferrer noreferrer" target="_blank">Alice@gmail.com</a>. The ID Token functions like an authentication credential.</div><div>Source: <a href="https://www.bastionzero.com/blog/generalizing-openpubkey-to-any-identity-provider" rel="noreferrer noreferrer" target="_blank">https://www.bastionzero.com/blog/generalizing-openpubkey-to-any-identity-provider</a></div><div><br></div><div>Between OpenPubKey doing this in the wild today, and this draft being adopted, the best we can do is give guidance on this kind of scenario. One simple recommendation could be to configure a dedicated RP at the OP for the particular use (SSH vs signing Docker images for example). I do see this called out in the OpenPubKey README, so is probably worth bringing into this draft in the security considerations. As long as the IdP is aware of what the ID token is being used for, that provides the capability for it to revoke access in some way.</div><div><br></div><div><a href="https://github.com/openpubkey/opkssh?tab=readme-ov-file#security-note-create-a-new-client-id-for-opkssh" rel="noreferrer noreferrer" target="_blank">https://github.com/openpubkey/opkssh?tab=readme-ov-file#security-note-create-a-new-client-id-for-opkssh</a></div><div><div><br></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Oct 9, 2025 at 3:21 PM Ethan Heilman via Openid-specs-ab <<a href="mailto:openid-specs-ab@lists.openid.net" rel="noreferrer noreferrer" target="_blank">openid-specs-ab@lists.openid.net</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">> e.g. the IDP has no visibility that these things are happening and no (currently standardised) way to communicate out revocation if a session turns out to be fraudulent etc.<br><br>Isn't the standard way to communicate revocation in OpenID Connect to revoke the refresh token? That is, the ID Token expires after 30 seconds to 2 hours depending, then if IDP revokes the refresh token, the ID token can't be refreshed and expires and that authentication session is no longer valid. This seems like the consensus pattern for revocation.<br><br>The SSH protocol, as far as I am aware, does not support closing existing SSH connections. You can set the SSH certificate to expire when the ID Token expires, but that only prevents creating new SSH connections with that certificate, SSH does not close the existing connections.<br><br><div>At Bastion Zero we did extend SSH to have this revocation functionality so that when the user is required to continuously send an unexpired ID Token or the connection closes. Thus, the IDP can revoke all connections opened by the authentication session by revoking the refresh token associated with that session. I've thought about adding this functionality to OPKSSH, but I haven't seen much demand for it. Most users are comfortable with the current access model provided by SSH.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Oct 9, 2025 at 1:42 PM Andrii Deinega via Openid-specs-ab <<a href="mailto:openid-specs-ab@lists.openid.net" rel="noreferrer noreferrer" target="_blank">openid-specs-ab@lists.openid.net</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>Dick, I think Joseph communicated this well (a way better than me in one of my <a href="https://lists.openid.net/pipermail/openid-specs-ab/2025-October/011052.html" rel="noreferrer noreferrer" target="_blank">previous</a> responses; English isn't my first language).</div><div><br></div><div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">e.g. the IDP has no visibility that these things are happening and no (currently standardised) way to communicate out revocation if a session turns out to be fraudulent etc.</blockquote><div><br></div><div>These are two crystal-clear items for me; there are others as well.</div><div><br></div><div>If you wish, I can go ahead and create issues to track those in <a href="https://github.com/dickhardt/openid-key-binding" rel="noreferrer noreferrer" target="_blank">https://github.com/dickhardt/openid-key-binding</a>, or other repo if you / we decide to move it under <a href="https://github.com/openid" rel="noreferrer noreferrer" target="_blank">https://github.com/openid</a> as per Mike, the OpenID Connect OpenID Connect Key Binding specification was adopted today.</div><div><br></div><div>All the best,</div><div>Andrii</div><div><br></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Oct 9, 2025 at 7:01 AM Dick Hardt <<a href="mailto:dick.hardt@gmail.com" rel="noreferrer noreferrer" target="_blank">dick.hardt@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">What do you see as the new problems Joseph?</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Oct 9, 2025 at 2:57 PM Joseph Heenan <<a href="mailto:joseph@authlete.com" rel="noreferrer noreferrer" target="_blank">joseph@authlete.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div>Hi<div><br></div><div>I am concerned that this logic is closer to “the SSH system is a single RP because the id_token is shared within that system” rather than “It makes sense to view the sshd as part of the relying party because of how it is constructed (when you exclude what they’re doing with id_tokens), and hence it makes sense to share the id_token between those entities."<br id="m_8931331292986429760m_5998498220997544285m_-3677879258555251279m_-8611349085469305773m_-5412990071188980167m_7583723736748167839m_-4147747999013335200m_7349304443391071591m_-7075336819650479317m_-4385585469923405232lineBreakAtBeginningOfMessage"><div><br></div><div>After having a read of <a href="https://www.bastionzero.com/openpubkey" rel="noreferrer noreferrer" target="_blank">https://www.bastionzero.com/openpubkey</a> it does sound like the id_token is really being used as some kind of super token being shared with multiple systems (there’s an example of the id_token then effectively being used to sign git commits), and much of this is arguably hidden from the user - the user and IDP authorised a single RP to have the users identity, and this is then being used with multiple parties that don’t have any direct relationship with the original IDP - that seems problematic as, e.g. the IDP has no visibility that these things are happening and no (currently standardised) way to communicate out revocation if a session turns out to be fraudulent etc.</div><div><br></div><div>It does feel a lot like the verifiable credentials ecosystems, but without the clear separation that there is an extra component involved & the behaviour of which is then clearly defined. It feels like trying to pretend these components are all part of the same RP is creating new problems rather than helping us figure out how a good design for these flows could be created.</div><div><br></div><div>Joseph</div><div><br></div><div><br><blockquote type="cite"><div>On 9 Oct 2025, at 07:37, Dick Hardt via Openid-specs-ab <<a href="mailto:openid-specs-ab@lists.openid.net" rel="noreferrer noreferrer" target="_blank">openid-specs-ab@lists.openid.net</a>> wrote:</div><br><div><div dir="ltr">I consider the SSH system to be a single RP.<br><br>The sshd is relying on the id_token from the OP to determine who the user is. The ssh utility in this case is just an intermediary, and part of the SSH system.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Oct 9, 2025 at 7:01 AM Andrii Deinega <<a href="mailto:andrii.deinega@gmail.com" rel="noreferrer noreferrer" target="_blank">andrii.deinega@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">There’s no confusion (at least for me). I don't consider an application that<br><ol><li>receives an ID Token from an OP, and</li><li>helps the ssh utility in forwarding it to sshd, and</li><li>uses the private key corresponding to the public key (specified in the cnf claim) to establish a SSH session</li></ol>to be different components of the same RP.<br><br>This is one of the use cases standing behind <span id="m_8931331292986429760m_5998498220997544285m_-3677879258555251279m_-8611349085469305773m_-5412990071188980167m_7583723736748167839m_-4147747999013335200m_7349304443391071591m_-7075336819650479317m_-4385585469923405232m_-1045751815295385407:1ng.2" role="menuitem" aria-haspopup="true">OpenPubkey</span>, and what's going there is well described and clearly communicated elsewhere but not in this WG... or, the OpenID Connect Key Binding spec from you.<br><br>I find it to be a clever way to authenticate a user in sshd (or basically, in other services) using OPs but at the same time, I don't think that forwarding (repurposing) existing ID Tokens is the right way to go.<br><br>This is why I kindly asked you to share <br><br><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">"more or less concrete use cases in this area (maybe... for a bit better transparency in this area)"</blockquote><br>as the very first tiny step.<div><br></div><div>All the best,</div><div>Andrii</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Oct 6, 2025 at 1:07 PM Dick Hardt <<a href="mailto:dick.hardt@gmail.com" rel="noreferrer noreferrer" target="_blank">dick.hardt@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Oct 6, 2025 at 7:56 PM Andrii Deinega <<a href="mailto:andrii.deinega@gmail.com" rel="noreferrer noreferrer" target="_blank">andrii.deinega@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Dick,<div><br></div><div>Do you consider a native OAuth client (which helps the ssh utility to inject and forward an ID Token) and sshd (which retrieves and handles the ID Token) to be two different components of the same RP?</div></div></blockquote><div><br></div><div>This is OpenID Connect, not OAuth, so that is confusing. <br><br>Two different components of the same RP is the use case.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><br></div><div>If yes... I'm curious whether, in your opinion, the OP should be aware that the ID Tokens it issues are actually being forwarded and used elsewhere.</div></div></blockquote><div><br></div><div>"used elsewhere" is vague ... Perhaps you can tell me your opinion on the point you are asking? </div></div></div>
</blockquote></div>
</blockquote></div>
_______________________________________________<br>Openid-specs-ab mailing list<br><a href="mailto:Openid-specs-ab@lists.openid.net" rel="noreferrer noreferrer" target="_blank">Openid-specs-ab@lists.openid.net</a><br><a href="https://lists.openid.net/mailman/listinfo/openid-specs-ab" rel="noreferrer noreferrer" target="_blank">https://lists.openid.net/mailman/listinfo/openid-specs-ab</a><br></div></blockquote></div><br></div></div></blockquote></div>
</blockquote></div>
_______________________________________________<br>
Openid-specs-ab mailing list<br>
<a href="mailto:Openid-specs-ab@lists.openid.net" rel="noreferrer noreferrer" target="_blank">Openid-specs-ab@lists.openid.net</a><br>
<a href="https://lists.openid.net/mailman/listinfo/openid-specs-ab" rel="noreferrer noreferrer noreferrer" target="_blank">https://lists.openid.net/mailman/listinfo/openid-specs-ab</a><br>
</blockquote></div>
_______________________________________________<br>
Openid-specs-ab mailing list<br>
<a href="mailto:Openid-specs-ab@lists.openid.net" rel="noreferrer noreferrer" target="_blank">Openid-specs-ab@lists.openid.net</a><br>
<a href="https://lists.openid.net/mailman/listinfo/openid-specs-ab" rel="noreferrer noreferrer noreferrer" target="_blank">https://lists.openid.net/mailman/listinfo/openid-specs-ab</a><br>
</blockquote></div>
</blockquote></div>
</blockquote></div>
</blockquote></div></div></div>
</div>
<span>_______________________________________________</span><br><span>Openid-specs-ab mailing list</span><br><span>Openid-specs-ab@lists.openid.net</span><br><span>https://lists.openid.net/mailman/listinfo/openid-specs-ab</span><br></div></blockquote></div></div></body></html>