Add WebAuthn Signal API support for passkeys - #68129
Open
rolandVi wants to merge 4 commits into
Open
Conversation
Contributor
|
Thanks for your PR, @rolandVi. Someone from the team will get assigned to your PR shortly and we'll get it reviewed. |
halter73
reviewed
Aug 1, 2026
| @@ -1 +1,2 @@ | |||
| #nullable enable | |||
| virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.MakePasskeySignalOptionsAsync(TUser! user, Microsoft.AspNetCore.Identity.PasskeyUserEntity! userEntity) -> System.Threading.Tasks.Task<string!>! | |||
Member
There was a problem hiding this comment.
Can you open an API proposal following the API review process? #67299 doesn't have a proposed API in it.
Things I'd want the proposal to settle: whether this belongs on IPasskeyHandler<TUser> rather than SignInManager, whether the returned JSON should be a superset of both signal payloads or something directly passable to each JS call, and whether MakePasskeySignalOptionsAsync is the right name once signalUnknownCredential (#68128) shows up, since that one takes a different payload and gets called before sign-in.
Member
Author
Co-authored-by: Stephen Halter <shalter+msft@microsoft.com>
rolandVi
force-pushed
the
roland/passkey-signals
branch
from
August 4, 2026 11:08
22e92f2 to
0f8b457
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
API proposal in #68165.
When someone deletes a passkey or changes their email, the browser's passkey provider now hears about it, so removed passkeys stop being offered at sign-in and the name shown next to a passkey stays right. Today the provider keeps its own copy and never finds out.
Usage
What changed
The payload is built by
IPasskeyHandler<TUser>, so it resolves the RP ID the same way creation and assertion already do and a custom handler stays consistent with the passkeys it issued.SignInManagerjust delegates, like the other passkey methods. The interface shipped in .NET 10, so the new member is a default interface method that throws, paired withSupportsSignalOptionsfor callers to check first.This has to live in the framework because an app can't easily assemble the payload: the user handle isn't the user ID, it's the UTF-8 bytes base64url encoded through the internal
BufferSource. Get it wrong and the call silently does nothing.The Blazor template renders a new
<PasskeySignals>component on the manage passkeys page and after an email change. It's a custom element rather than JS interop because those pages are static SSR.Not included
signalUnknownCredentialis not here. It deletes permanently instead of hiding, and sign-in can't yet tell "unknown credential" apart from any other failure, so it needs an API addition first. Tracked in #68128.Testing
Covered end to end with the CDP virtual authenticator: the signalled credential list has to match what the authenticator actually holds, and empty out after a delete.
Resolves #67299