Files
jobtrackingapp/docs/verification/sec-004-microsoft-identity.md
T

3.4 KiB

SEC-004 canonical Microsoft identity verification

Date: 2026-08-02

Status: IMPLEMENTED — NOT VERIFIED. Repository implementation, synthetic controller tests, frontend component tests, build, migration SQL and disposable SQLite upgrade checks pass. Real Microsoft, browser, SMTP, MariaDB execution and production legacy inventory remain blocked.

Implemented trust path

  • Microsoft account ownership is the normalized GUID pair (MicrosoftTenantId, MicrosoftObjectId) with a unique composite database index.
  • Exchange and conflict lookup use only that pair. MicrosoftSubject is no longer written and provider email is metadata only; a matching local email returns a safe conflict instead of a link.
  • New Microsoft registration stores the pair immediately, leaves application email unconfirmed, and obeys the verification-required 202/no-session gate.
  • Explicit link requires the authenticated local user's current password. Link and unlink revoke all sessions/trusted devices; passwordless unlink is refused as a last-credential guard.
  • Legacy fields remain null-canonical evidence. A single eligible candidate receives a purpose-bound proof at its confirmed application email. Confirmation requires that proof plus a fresh Microsoft token for the exact same (tid, oid) pair. Multiple or unconfirmed candidates require operator-assisted recovery.
  • Frontend MSAL authority uses the same AUTH_MICROSOFT_TENANT value passed at build time.

Evidence

  • Focused auth controller tests: 34/34 passed.
  • Full backend suite: 507/507 passed.
  • Full frontend suite: 44 suites, 152/152 passed; production build passed.
  • SQLite migration SQL uses two nullable TEXT columns and a unique composite index.
  • MariaDB migration SQL uses two nullable varchar(36) columns and the same unique index.
  • Disposable SQLite legacy rehearsal:
    • two rows with duplicate legacy subject/email values remained unchanged and null-canonical;
    • migration applied without backfill;
    • first canonical pair assignment succeeded;
    • duplicate pair assignment failed with SQLite unique-constraint exit 19.
  • Production Compose interpolation includes the same tenant mode in backend configuration and the frontend build argument.

Blocked checks and residual risk

  • No real Microsoft token/account was used. Issuer/tenant/signature behavior is covered by the SEC-003 signed-token tests; exchange/link/recovery use mocked tenant-qualified principals.
  • The existing browser policy blocker was not retried. No browser workflow, popup, accessibility, mobile or screenshot claim is made.
  • No SMTP sink was available, so the complete emailed recovery link was not exercised end to end.
  • MariaDB SQL generation passed, but no disposable MariaDB execution environment was available.
  • Production legacy counts and collision groups are unknown. Microsoft production enablement must remain gated until the counts-only inventory in deploy/README.md and migration/version-skew checks pass.
  • Legacy rows with multiple candidates or unavailable/unconfirmed app email deliberately require operator verification; no automated merge is attempted.

Rollback

Disable Microsoft sign-in by clearing its client ID, roll back application binaries, and retain the additive columns and legacy evidence. Do not restore subject-only or email auto-linking. The migration Down is appropriate only before canonical pair data is relied upon.