[OAUTH-WG] New I-D: Identity Continuation Assertion for OAuth 2.0 Token Exchange (request for review)

Karl McGuinness <me@karlmcguinness.com> Tue, 04 August 2026 23:03 UTC

Return-Path: <me@karlmcguinness.com>
X-Original-To: oauth@mail2.ietf.org
Delivered-To: oauth@mail2.ietf.org
Received: from localhost (localhost [127.0.0.1]) by mail2.ietf.org (Postfix) with ESMTP id 430B5123BA174 for <oauth@mail2.ietf.org>; Tue, 4 Aug 2026 16:03:42 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ietf.org; s=ietf1; t=1785884622; bh=4W7J5KuhXe0k792Zce3r6+8EmDIOR+3MX9jMl7Cq9r0=; h=References:In-Reply-To:From:Date:Subject:To; b=ECSxkPeYgYmpa6VU6X2tCzEqBXEoBUTRzARNzX3w+6dZWyO8RwFNCHnJcVVXvOEjC BWYFT64RNquyFy473wGYUtPv4NUb3Q0PWwqUXw2cGGsyDTxpRw2Szf1fzXHaKJiMBy zodSfzUUjpZEVesRaAPPrjJNHZVaHY5D8J3SrqzE=
X-Virus-Scanned: amavisd-new at ietf.org
X-Spam-Flag: NO
X-Spam-Score: -1.839
X-Spam-Level:
X-Spam-Status: No, score=-1.839 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, HTML_MESSAGE=0.001, HTML_OBFUSCATE_05_10=0.26, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001] autolearn=ham autolearn_force=no
Authentication-Results: mail2.ietf.org (amavisd-new); dkim=pass (2048-bit key) header.d=karlmcguinness.com
Received: from mail2.ietf.org ([166.84.6.31]) by localhost (mail2.ietf.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id slGtvXqzAefZ for <oauth@mail2.ietf.org>; Tue, 4 Aug 2026 16:03:41 -0700 (PDT)
Received: from mail-wr1-x42f.google.com (mail-wr1-x42f.google.com [IPv6:2a00:1450:4864:20::42f]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature ECDSA (P-256) server-digest SHA256) (No client certificate requested) by mail2.ietf.org (Postfix) with ESMTPS id 64C7E123BA16D for <oauth@ietf.org>; Tue, 4 Aug 2026 16:03:41 -0700 (PDT)
Received: by mail-wr1-x42f.google.com with SMTP id ffacd0b85a97d-47f904e80eeso259435f8f.1 for <oauth@ietf.org>; Tue, 04 Aug 2026 16:03:41 -0700 (PDT)
ARC-Seal: i=1; a=rsa-sha256; t=1785884620; cv=none; d=google.com; s=arc-20260327; b=Pvvk2Qx6r3dwCFdMtZ+QH3J8oR6oo4bHstIuMaJPJJT1vEIo6LiZhmCeJ5ae7tkGte VpwN9mgGcmIvuHOf0MGGKeP5Cai2EtOzT5XQ95prCRh4Cao6io9V7SqhOvGb7KKxSUj1 8O0ZYYmsyZ8oVjhTBTgA110pqy4QrfM//s34eJBE/yPYcSXCZrB9ROS/eE2yylEy9Q2n bQ3wh2FpnurpO6sA2raDE5lPkclM+/aabTRyq1bkdW4FYqO5z8yIhynT6RQtvUR1Xwon MyQhIShgPg1MSvGAsbSMZ2vqQgcG4rbSoJwxdXf0vFNrJsAN29o37hwe4ezQ2fWPl/72 TTgQ==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :dkim-signature; bh=a0cy3IUliZbZKSRC9wo0NhXd2fk5q+sJGcYAbMBs6BM=; fh=HRwJNtTTtPgtfgvXyPaPq+Te1JrkxlJZMfmgN30AIzQ=; b=K8as5VXACDz2bZHAyijXWZgaVgq4C1C/UsZYHiwaPEIscMm2J5jh5T8UdFCriIxl4J vtg/Z+tt7I7JBUdjQX+1MDGdfJdJ7aYO8C8cTFe08rCiRqjFui0r/chyh7BZm5smGsUF mA1SEdwJC4GLPSqF3tzIBVo/frjRgrfy7UG4b0n8GaL7Wf1BSYo2njG/SCmuCd6s0ZrO Tdv3Zbv54Mer1rpHJUNP9wYwWLvVwHZNhGCeC7boxWgjm2jR3YUjPCZgzQ7CZwDBDaf+ E0Yl0TEqWxQuOyVrWGCe6RL54l4kfNe/ufP7iTzZOhWlH5Fq4HupWilBvk8n+41UhIEt sJZQ==; darn=ietf.org
ARC-Authentication-Results: i=1; mx.google.com; arc=none
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=karlmcguinness.com; s=google; t=1785884620; x=1786489420; darn=ietf.org; h=content-type:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to :content-type; bh=a0cy3IUliZbZKSRC9wo0NhXd2fk5q+sJGcYAbMBs6BM=; b=Kmiby/haDqv8DpZl8+hOmvTiK2ytzA3AdmCH4/xlJRzwqVgXjYWlHhC8gCk2mgEK1O Fh66o2yluANqkS0WGWosEMREaqu4DGv6Hm6TU6R51nzoyefNsgmz80E8I8bBI8mjkgmA CgkzJJWNno6iFpVAL28ru9pzro+mMl5g8v8OBpgO9zN7W6tb53FokhxUqO60CaW0nqAN Y+CIsBIkwvXurdikSi0iShptL/OkXHtl6y4vjrGQ+4TZNz/EaZjr78CZSBmTnIkhiyxs omUrSsV3PGtR8+nJc9N1N5WFPeeRAToF8q+IufDbqNSakKwLBk7uxKozQ1t2LKzXOFoJ rwPg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785884620; x=1786489420; h=content-type:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=a0cy3IUliZbZKSRC9wo0NhXd2fk5q+sJGcYAbMBs6BM=; b=Doeu9E4/dj7Ju1OKY3TPpwKS2RsnIQjDiv3lQrf5E/xVX4osbTyUlusj4bSAilBywB 2H3aUeRYCWkrxFfsTBSWgnwAzLj0ZrXtACm+AWlrodgRjMAlQuJ2/B/MVCIKfMgt3kuP E7f5m/TBrIvUpWGHdW2fe/zc3/ZkTpLpTL2rNAJP05NjNh4DrBS675W59CNV+IT4q9ro W4IFih+f3lYxX1IR56uwHolZ+wAFl57zaoISGOGmYEsZk690Ubp1SBUSVH4bMpS1y2Un PUatJ2rk85wVuiF+NKGCiDCHVQLPp8IP8mPX5gZjHQVJIfG1B5cGa/7SZkpc6N9bBmOU 6meQ==
X-Gm-Message-State: AOJu0YxZj3VCtz0sRIMWLIJ0a/vlP82Lyl7JEXlTu6rdJFKx7X71EgfJ MN1INJ6xavM33Dc80n2Xt6hH6XT5OR5X4vnxa6olXhMgJRc1wVYiVrKyA8568klhQQDbGrB/CHV JL/FJvP4UHxlzc5dONoHw+Rk3wRGY+WXNA8BB7IpS2d+ekwuYsDEYxracoQ==
X-Gm-Gg: AR+sD11MWhUqcF0gVddFUyv4XBUcxD0EbgNY/O2kTO6Yn5NMQDV+3D4urUlp9jolWuc K7TRKcrbAtj8CC2goxh6fHQvPbEoZIWKxMEJX2O0nrq8gsQubq2784PK72pBHwUpQocGtnu5NYW bLisqGRLbc3HWTbLBBLEiGPdlRM73tq6S2dxKweB50+vSbBbmh2OZchq2Qg8FnJLZWWpy9yPwiQ SCaNwM2gV3H/dg87HEGZA/nkgU8Oo+o9yoP7z1lp/WtpfdVdCwUJKgYqlYedizs+6duWwpkRAfW IYvrnFl3GHR79zCkQEu1jPIhvOCE+1kfyG+IsQHmbc+1GCw8STt5fPUIl8/Bil0xJmQQDeWOZtY tj7BYaBMnR8yXpwynXrFYeoKztbf9QiPyjUv/h4jn/OH4TNtGZeySYtOY71puLoueCbo80LmeiK 1j8X8b0TNIlg==
X-Received: by 2002:a05:6000:1208:b0:47f:6fe0:294a with SMTP id ffacd0b85a97d-47fec62b8d5mr3067426f8f.23.1785884620312; Tue, 04 Aug 2026 16:03:40 -0700 (PDT)
MIME-Version: 1.0
References: <178577782564.1908637.17541848751068279521@dt-datatracker-d4d6ff9d9-fsx7d>
In-Reply-To: <178577782564.1908637.17541848751068279521@dt-datatracker-d4d6ff9d9-fsx7d>
From: Karl McGuinness <me@karlmcguinness.com>
Date: Tue, 04 Aug 2026 16:03:28 -0700
X-Gm-Features: AUfX_mwhBmAm-18aKc1C_LssI_wgE6rq9tDIuW0YliGHBKUUkQgv0aUGAQrYQ0Y
Message-ID: <CAPVrLW1dPqf+B=r7FaKY3ysZUwzCGt=2w8ju-_cU9yeSqC21-g@mail.gmail.com>
To: oauth@ietf.org
Content-Type: multipart/alternative; boundary="00000000000067616a065840aae2"
Message-ID-Hash: QH4CZBD2UY5UG7HW7UD2WJXNAXNJROUX
X-Message-ID-Hash: QH4CZBD2UY5UG7HW7UD2WJXNAXNJROUX
X-MailFrom: me@karlmcguinness.com
X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-oauth.ietf.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header
X-Mailman-Version: 3.3.9rc6
Precedence: list
Subject: [OAUTH-WG] New I-D: Identity Continuation Assertion for OAuth 2.0 Token Exchange (request for review)
List-Id: OAUTH WG <oauth.ietf.org>
Archived-At: <https://mailarchive.ietf.org/arch/msg/oauth/Zk2xUUcoauU4tLShl-82l2YkR4k>
List-Archive: <https://mailarchive.ietf.org/arch/browse/oauth>
List-Help: <mailto:oauth-request@ietf.org?subject=help>
List-Owner: <mailto:oauth-owner@ietf.org>
List-Post: <mailto:oauth@ietf.org>
List-Subscribe: <mailto:oauth-join@ietf.org>
List-Unsubscribe: <mailto:oauth-leave@ietf.org>

Hi all,

I've posted a new individual Internet-Draft, Identity Continuation Assertion
<https://datatracker.ietf.org/doc/draft-mcguinness-oauth-id-continuation-assertion/>
 (ICA), and would welcome the group's review.

Agents and long-running jobs increasingly keep working on a user's behalf,
calling one service after another across trust domains. Often the user is
not present at the hop to authorize the next step. Sometimes they have gone
offline. Other times they are online, but a downstream service-to-service
call has no user-agent in the path. Either way, redirecting the user's
browser to the identity provider for a fresh grant is not an option.

This came up in the ID-JAG discussion of public agents behind an API
gateway or proxy (issue #114
<https://github.com/oauth-wg/oauth-identity-assertion-authz-grant/issues/114>).
I had sketched the idea earlier, framing re-subjecting across a boundary as
a mint rather than an attenuation
<https://notes.karlmcguinness.com/notes/the-identity-continuation-assertion/>,
and that discussion suggested writing it up.

At such a hop, the service continuing the work holds none of the user's
credentials. Worse, where the identity provider gives each service its own
pairwise identifier for the user, a downstream service cannot even name the
user to the next one. The tempting shortcut is to keep a token and replay
it, or to hand an intermediary a broad, long-lived credential. Both
recreate the classic confused-deputy problem. A shared or public component
now holds standing authority it can be tricked into using for the wrong
user, the wrong resource, or beyond its task. The receiving service, seeing
a valid token, cannot tell legitimate continuation from misuse.

Instead of carrying a token forward, ICA has each boundary ask the identity
provider to mint a fresh one. A service presents a short-lived,
sender-constrained (DPoP-bound) assertion as the subject_token in an RFC
8693 token exchange. The identity provider validates it and issues the next
token, an audience-scoped ID-JAG
<https://datatracker.ietf.org/doc/draft-ietf-oauth-identity-assertion-authz-grant/>,
for the downstream service. The link between hops is a non-bearer handle
that the receiving service binds to its own authorization state, so a
copied handle is useless to anyone else. Chains root in a grant the
identity provider already holds for the user, such as a refresh token or an
OIDC or SAML session. Each hop is then a fresh authorization decision,
bounded by what was authorized up front, not an inherited standing
permission.

For the client that starts a chain, nothing changes. It obtains an ordinary
first ID-JAG, with no ICA-specific machinery. The new work falls on the
identity provider and any receiving service that chooses to support
continuation, so adoption is incremental.

ICA is meant to complement related efforts, not compete with them.
draft-zhu-oauth-async-delegation
<https://datatracker.ietf.org/doc/draft-zhu-oauth-async-delegation/> (Delegated
Refresh Tokens) keeps one authorization server minting for the same user
from a stored, rotating refresh token. ICA handles the different case where
the user is unchanged but the audience changes. The two compose, because a
delegated refresh token can be the grant a continuation chain roots in.

Several drafts already describe how to represent and verify the chain of
actors a delegated request passes through. These include
draft-mcguinness-oauth-actor-profile
<https://datatracker.ietf.org/doc/draft-mcguinness-oauth-actor-profile/> with
its actor receipts and actor proofs companions, and
draft-mw-oauth-actor-chain
<https://datatracker.ietf.org/doc/draft-mw-oauth-actor-chain/>. They build
on RFC 8693's act claim. But act, and the actor_token that produces it,
convey the actor's identity as a bearer assertion, so AFAIK none defines
how the actor making a request proves possession of its own key. ICA has to
take a position on that, since it binds each assertion to the calling
actor's own key. These efforts would benefit from a shared approach rather
than each solving it separately, and I would welcome discussion on whether
that is worth doing and where it should live.

I would value the group's input on a few specific questions.

   - Is a fresh mint at the identity provider at every boundary the right
   model, or is that per-hop round-trip too costly for some deployments?
   - Acceptance of a hop is attested within the accepting domain rather
   than verified by the identity provider, so is that trust boundary
   acceptable, and how should it be hardened?
   - And do others see this same cross-domain continuation gap in agentic
   or multi-hop deployments, or are they solving it another way?

Thanks,

Karl McGuinness

---------- Forwarded message ---------
From: <internet-drafts@ietf.org>
Date: Mon, Aug 3, 2026 at 10:23 AM
Subject: New Version Notification for
draft-mcguinness-oauth-id-continuation-assertion-00.txt
To: Karl McGuinness <public@karlmcguinness.com>


A new version of Internet-Draft
draft-mcguinness-oauth-id-continuation-assertion-00.txt has been
successfully
submitted by Karl McGuinness and posted to the
IETF repository.

Name:     draft-mcguinness-oauth-id-continuation-assertion
Revision: 00
Title:    Identity Continuation Assertion for OAuth 2.0 Token Exchange
Date:     2026-08-03
Group:    Individual Submission
Pages:    60
URL:
https://www.ietf.org/archive/id/draft-mcguinness-oauth-id-continuation-assertion-00.txt
Status:
https://datatracker.ietf.org/doc/draft-mcguinness-oauth-id-continuation-assertion/
HTML:
https://www.ietf.org/archive/id/draft-mcguinness-oauth-id-continuation-assertion-00.html
HTMLized:
https://datatracker.ietf.org/doc/html/draft-mcguinness-oauth-id-continuation-assertion


Abstract:

   This document defines the Identity Continuation Assertion, a short-
   lived, sender-constrained JWT used as an OAuth 2.0 Token Exchange
   subject token.  It lets an Identity Provider (IdP) issue an onward
   Identity Assertion JWT Authorization Grant (ID-JAG) when a user's
   request crosses service boundaries after the user is no longer
   present.  The profile targets deployments in which several Resource
   Authorization Servers trust one IdP and use audience-local subject
   identifiers that only the IdP can resolve.  It complements offline
   attenuation for intra-domain fan-out that does not change the
   subject.



The IETF Secretariat