Changelog
Modules

Passkeys

WebAuthn passwordless register/login and credential management endpoints.

Passkey (WebAuthn) endpoints for passwordless register/login and managing credentials on an existing account.

DI

builder.Services.AddPasskeyEndpoints();

Facade: passkeys are enabled by default; set Passkeys.ServerDomain (required in Production).

Map

app.MapGroup("/account").MapPasskeyEndpoints<AppUser>();

Routes are mapped under {prefix}/passkeys (facade default /account/passkeys).

Routes

MethodPathAuth / extras
POST/passkeys/creationOptionsAuth + ReAuth + CSRF + rate limit
POST/passkeys/requestOptionsCSRF + rate limit; optional ?username=
POST/passkeys/register/optionsCSRF; body { email }
POST/passkeys/registerCSRF; passwordless create + sign-in
POST/passkeys/loginCSRF; scheme via useCookies / useSessionCookies
POST/passkeys/Add passkey (auth + ReAuth + CSRF)
GET/passkeys/List passkeys (auth)
PATCH/passkeys/Rename (auth + ReAuth + CSRF)
DELETE/passkeys/{credentialIdUrl}Remove (auth + ReAuth + CSRF)

Passwordless register flow

  1. POST /account/passkeys/register/options with { "email": "..." }
  2. Browser navigator.credentials.create(...)
  3. POST /account/passkeys/register with { "email": "...", "credentialJson": "..." }

Sign-in scheme

After register/login:

  • ?useCookies=true → persistent application cookie
  • ?useSessionCookies=true → session application cookie
  • neither → Identity bearer token (AccessTokenResponse)

JWT is not issued — call JWT /create separately if your host uses JWT.

Constraints

  • Passwordless register needs IdentityUser with string or Guid key.
  • CSRF is required for WebAuthn ceremonies.
  • Sensitive credential mutations require ReAuth.