- Enable globally via CompleteUnitOfWorkOnResponseStarting or per path via the Urls list
- OpenIddict opts in its endpoints so token/session rows commit before the response
- Delete the link users after the user is saved, a concurrency failure kept them deleted
- Create organization units of the current tenant only and insert them after every group is valid
- Clear password histories and passkeys, load the collections if they are missing
- Delete sessions, user delegations and link users with UserDeletedEventHandler
- Add OrganizationUnitManager.CreateManyAsync
- reset background/border/shadow on :not(.is-open) so hover/focus cannot leak the panel look
- return focus to the button only on Escape close, not on outside-click
- add a :focus-visible ring on the toggle button for keyboard users
- keep the info line visible in the popover
- namespace and unbind the toggle handlers to avoid stacking on re-init
When the cookie security stamp is refreshed during a /connect/authorize
request, OpenIddictClaimsPrincipalContributor stamps the ambient request's
client_id onto the principal that is written back to the interactive
authentication cookie. From then on ICurrentClient.Id resolves to that client
for every later cookie-authenticated request, corrupting audit-log client
attribution.
The contributor cannot tell whether the principal it contributes to is destined
for a token (correct) or for the cookie being refreshed (wrong), so strip
client_id at the only point where the cookie is actually re-written: the
security-stamp OnRefreshingPrincipal callback. This never runs for token
issuance, so the token path is untouched, and chaining the removal after the
existing AbpSecurityStampValidatorCallback.UpdatePrincipal lets already-corrupted
cookies self-heal on their next refresh.
Adds Volo.Abp.OpenIddict.AspNetCore.Tests covering the removal and the callback
composition order.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>