Passwordless Authentication - Passkeys
Passwordless authentication can offer passkeys next to its own token-based flow. Passkeys are handled by FIDO2 WebAuthn acting as a primary authentication strategy, so the passkey assertion is verified and the user is logged in exactly as with the passkey button of the CAS login form.
Passkeys are offered when WebAuthn is allowed to act as a primary authentication strategy:
The following settings and properties are available from the CAS configuration catalog:
cas.authn.mfa.web-authn.core.allow-primary-authenticationConfigure the authentication flow to allow web-authn to be used as the first primary factor for authentication.
falseConfigure the authentication flow to allow web-authn to be used as the first primary factor for authentication. Registered accounts with a valid webauthn registration record can choose to login using their device as the first step.
Required settings may be needed to activate or affect the feature; review them even when they have a default. Optional settings only need to be set to change a default or to turn on the behavior they control. Third party settings belong to libraries such as Spring Boot that CAS builds on; their own documentation may have more detail.
Notes on configuration
Configuration Metadata
The collection of configuration properties listed in this section are automatically generated from the CAS source and components that contain the actual field definitions, types, descriptions, modules, etc. This metadata may not always be 100% accurate, or could be lacking details and sufficient explanations.
Be Selective
This section is meant as a guide only. Do NOT copy/paste the entire collection of settings into your CAS configuration; rather pick only the properties that you need. Do NOT enable settings unless you are certain of their purpose and do NOT copy settings into your configuration only to keep them as reference. All these ideas lead to upgrade headaches, maintenance nightmares and premature aging.
YAGNI
Note that for nearly ALL use cases, declaring and configuring properties listed here is sufficient. You should NOT have to explicitly massage a CAS XML/Java/etc configuration file to design an authentication handler, create attribute release policies, etc. CAS at runtime will auto-configure all required changes for you. If you are unsure about the meaning of a given CAS setting, do NOT turn it on without hesitation. Review the codebase or better yet, ask questions to clarify the intended behavior.
Naming Convention
Property names can be specified in very relaxed terms. For instance cas.someProperty, cas.some-property, cas.some_property are all valid names. While all
forms are accepted by CAS, there are certain components (in CAS and other frameworks used) whose activation at runtime is conditional on a property value, where
this property is required to have been specified in CAS configuration using kebab case. This is both true for properties that are owned by CAS as well as those
that might be presented to the system via an external library or framework such as Spring Boot, etc.
When possible, properties should be stored in lower-case kebab format, such as cas.property-name=value.
The only possible exception to this rule is when naming actuator endpoints; The name of the
actuator endpoints (i.e. ssoSessions) MUST remain in camelCase mode.
Settings and properties that are controlled by the CAS platform directly always begin with the prefix cas. All other settings are controlled and provided
to CAS via other underlying frameworks and may have their own schemas and syntax. BE CAREFUL with
the distinction. Unrecognized properties are rejected by CAS and/or frameworks upon which CAS depends. This means if you somehow misspell a property definition
or fail to adhere to the dot-notation syntax and such, your setting is entirely refused by CAS and likely the feature it controls will never be activated in the
way you intend.
Validation
Configuration properties are automatically validated on CAS startup to report issues with configuration binding, especially if defined CAS settings cannot be recognized or validated by the configuration schema. Additional validation processes are also handled via Configuration Metadata and property migrations applied automatically on startup by Spring Boot and family.
Indexed Settings
CAS settings able to accept multiple values are typically documented with an index, such as cas.some.setting[0]=value. The index [0] is meant to be
incremented by the adopter to allow for distinct multiple configuration blocks.
Passkey Autofill
The passwordless username field is marked with autocomplete="username webauthn" and, where the browser supports
WebAuthn conditional mediation, CAS asks the browser for a passkey as soon as the page loads. The browser then lists the
passkeys it holds for CAS in the autofill menu of the username field, next to any saved usernames. Picking one completes
the login without a username or token; typing a username continues with the passwordless flow as usual. Browsers without
conditional mediation show the field as before.
Selection Menu
When the selection menu is available to the account, it also offers a passkey option that asks the browser for a passkey with its own prompt.
Requirements
- Passkeys must be registered as discoverable credentials. The passkey request is made before anyone is authenticated, so it names no credentials, and only passkeys that the authenticator can find on its own are offered. Registration takes place during WebAuthn multifactor authentication or through the device registration APIs.
- The passkey decides who logs in. A username typed on the passwordless page does not restrict which passkey may answer.
- Passkey providers that sync passkeys across devices, such as iCloud Keychain, Google Password Manager, 1Password or Bitwarden, usually register passkeys without attestation. Such registrations are rejected unless untrusted attestation is allowed via CAS settings.
A passkey that logs the user in on its own should also verify the user with a PIN or biometric. Unless
cas.authn.mfa.web-authn.core.user-verification-requirement is set to REQUIRED, the default
is PREFERRED and an authenticator that only checks for user presence, such as a security key without a PIN,
is accepted.
In browsers that support passkey autofill, every view of the passwordless username page starts a passkey request, which creates an HTTP session on the server before the user does anything. Take this into account when sessions are shared across CAS nodes.