MFA and password policy

Multi-factor methods, enrolment and challenge, tenant-wide MFA enforcement, administrator resets, and the per-tenant password policy.

Multi-factor methods#

MethodNotes
TOTP (RFC 6238)Any authenticator app; the secret is stored encrypted.
Recovery codesGenerated at enrolment; each code is single-use.
SMS one-time codeRequires an SMS provider configured on the deployment (Messaging).

Challenges are rate-limited.

Enrolment and challenge#

Users enrol from their profile in the app, or are sent to enrolment at next login when the tenant requires MFA. The flow lives on the auth server (/mfa-setup, /mfa-setup/complete, /mfa-challenge, /mfa-challenge/recovery) and runs between password verification and token issuance, so every client — the app, the CLI’s browser login, connected apps — gets MFA for free.

Requiring MFA for a tenant#

PUT /api/admin/mfa/policy
{ "mfaRequired": true }

(GET reads it; Setup → Security → MFA policy in the console; needs MANAGE_USERS.) Once required, users without an enrolled factor are taken to enrolment at their next login.

Administrator actions#

ActionEndpoint
See whether a user has MFA enrolledGET /api/admin/mfa/users/{userId}/status
Reset a user’s MFA (lost device)POST /api/admin/mfa/users/{userId}/reset

Both are in Setup → Administration → Users and require MANAGE_USERS. A reset removes the factor and recovery codes; the user re-enrols at next login.

Password policy#

One policy per tenant, edited under Setup → Security → Password policy, or GET/PUT /api/admin/password-policy:

SettingDefault
Minimum / maximum length8 / 128
Require uppercase, lowercase, digit, special characteroff
Password history (previous passwords rejected)3
Dictionary check (common passwords rejected)on
Personal-data check (name, email fragments rejected)on
Lockout threshold (failed attempts)5
Lockout duration30 minutes
Maximum age (days; forces rotation)unset

Locked accounts show status: LOCKED and unlock automatically after the lockout duration, when an administrator resets the password, or on POST /api/admin/password-policy/users/{userId}/unlock. Administrator-initiated resets (POST /api/admin/users/{userId}/reset-password, MANAGE_USERS) and new invitations force a password change at next login.

Edit this page on GitHub