Skip to content

Authentication & Authorization Overview

Section: 14 — Auth
Last Updated: 2026-05-30
Scope: Keycloak, JWT, dual-token, session limiting, multi-realm


Architecture at a Glance

Microtec ERP uses Keycloak as the central Identity Provider (IdP) with a custom dual-token design to bridge standard OIDC with ERP-specific business concepts.


Key Components

ComponentTechnologyPurpose
Identity ProviderKeycloak 24.xOIDC / OAuth 2.0 authentication
ERP Token Service.NET 8 (Auth project)Business-context token generation
Session StoreAzure RedisSession limiting + token blacklist
API GatewayOcelot + YARPToken validation + routing
Custom SPIsKeycloak SPI (Java)Multi-account, claim mapping

Dual-Token Design

See dual-token-design.md for the complete design doc.

The core insight: Keycloak knows who you are; ERP knows what you can access.

TokenIssued ByContainsLifetime
Keycloak JWTKeycloak IdPUser identity, email, roles5–15 min
ERP Access Context TokenERP Auth ServiceCompany, Branch, Module permissions1 hour

Both tokens are required for every API request:

  • Authorization: Bearer <keycloak-jwt> — identity verification
  • X-Access-Context: <erp-token> — business context

Realms

ERP uses two Keycloak realms to separate concerns:

RealmApplicationsUsersCustom SPIs
microtecAll ERP apps (Angular + mobile)Tenant employeescompany-branch-mapper, erp-policy-mapper
businessownerBO portal (admin)Tenant admins, resellersSimplified — no company-branch mapping

Realm Isolation

Realm isolation means:

  • Session tokens from microtec are not valid in businessowner and vice versa
  • Each realm has its own token signing keys
  • Admin users in businessowner cannot access ERP tenant data

Custom Keycloak SPIs

Three custom SPIs are deployed in the KeycloakProviders/ directory:

SPIPurposeRealm
company-branch-mapperMaps selected company/branch to JWT claimsmicrotec
erp-policy-mapperMaps ERP module permissions to JWT claimsmicrotec
multi-account-switcherAllows switching between companies without re-loginmicrotec

See Keycloak section — 06 for SPI deployment and configuration.


Session Limiting

See session-limiting.md for full configuration.

  • Default: 1 active session per user (globally)
  • Backend: Redis-backed session registry
  • Eviction policy: Oldest session evicted when limit reached
  • Config key: SessionValidation:GlobalDefaultMaxSessions

JWT Claims Reference

See jwt-claims.md for the complete claim mapping table.

Key custom claims added by Keycloak SPIs:

json
{
  "sub": "user-uuid",
  "tenant": "acme-corp",
  "companyid": "550e8400-...",
  "branchId": "...",
  "erp_policies": "accounting:read,hr:write,inventory:read",
  "erp_id": "...",
  "subdomain": "acme"
}

Authentication Flow


Service Registration

Backend services register auth via the Microtec.Web.Core NuGet package:

csharp
// Program.cs (all microservices)
builder.Services
    .AddMicrotecAuthentication(builder.Configuration)
    .AddMicrotecAuthorization();

Configuration required:

json
{
  "Keycloak": {
    "Authority": "https://auth.microtec-test.com/realms/microtec",
    "Audience": "erp-api",
    "ValidateIssuer": true,
    "ValidateAudience": true
  }
}

Security Considerations

RiskMitigation
Token theftShort-lived Keycloak JWTs (5–15 min)
Session hijackingRedis session binding + IP validation (optional)
Multi-session abuseSession limiting (1 session/user)
Cross-tenant accessTenantId in JWT + global EF Core query filter
Privilege escalationERP policy mapper validates against DB permissions

Internal Documentation — Microtec Platform Team