---
title: Authentication Frameworks
url: https://doc.liz6.com/en/networking/12-security-protocols/03-authentication-frameworks
locale: en
area: networking
tags:
- networking
- security-protocols
date: 2026-06-30
modified: 2026-07-16
description: 'Kerberos (symmetric key + tickets), SAML (federated identity + XML assertions), WebAuthn (public key + local biometrics) — three authentication frameworks addressing three distinct scenarios: intra-domain, cross-domain, and phishing resistance. LDAP and RADIUS provide directory and network access at the infrastructure layer.'
---

# Authentication Frameworks

> Kerberos (symmetric key + tickets), SAML (federated identity + XML assertions), WebAuthn (public key + local biometrics) — three authentication frameworks addressing three distinct scenarios: intra-domain, cross-domain, and phishing resistance. LDAP and RADIUS provide directory and network access at the infrastructure layer.

## Overview

The question "authentication" always answers is the same — **how to prove you are you** — but different protocols place the "proof" in different places, leading to several generations:

| Protocol | Year | Credential Form | Trust Place | Main Battlefield |
|---|---|---|---|---|
| Kerberos | 1988 | Symmetric Ticket | Central KDC | Enterprise Intranet / AD |
| LDAP bind | 1993 | Username + Password | Directory Server | Internal Directory / Backend Storage |
| SAML 2.0 | 2005 | Signed XML Assertion | IdP | Enterprise Web SSO |
| RADIUS | 1991 | Shared Secret + EAP | AAA Server | Network Access (WiFi/VPN) |
| WebAuthn | 2019 | Asymmetric Key Pair | User Device | Phishing-resistant passwordless login |

Understanding one main thread is enough: **passwords are a liability**. They are reused, phished, subjected to credential stuffing, and leaked during transmission and storage. Each subsequent generation of protocols tries to make passwords appear less often — Kerberos ensures passwords are only used once locally to derive keys and never traverse the network; SAML/OIDC ensures passwords are only given to one IdP; WebAuthn completely replaces passwords with non-exportable private keys stored on the device. The essence of selection is: **to what extent can passwords be eliminated given your existing infrastructure and threat model**.

## Kerberos — Ticket-based Single Sign-On

The foundation of AD domain login. The core idea: the user derives a key from their password only once during login, and thereafter accesses services entirely using **time-limited symmetric encryption tickets**, so the password never traverses the network.

<svg viewBox="0 0 720 330" xmlns="http://www.w3.org/2000/svg" font-family="-apple-system,'Source Han Sans CN','Microsoft YaHei',sans-serif" role="img" aria-label="Kerberos three-stage ticket authentication process">
  <defs><marker id="kbah1" markerWidth="10" markerHeight="8" refX="8" refY="3" orient="auto"><path d="M0,0 L8,3 L0,6 Z" fill="#475569"/></marker></defs>
  <rect width="720" height="330" fill="#ffffff"/>
  <text x="360" y="28" text-anchor="middle" font-size="17" font-weight="700" fill="#1f2933">Kerberos Three Stages: Log in once, then rely entirely on tickets</text>
  <text x="360" y="46" text-anchor="middle" font-size="11" fill="#64748b">Roles: KDC = AS (Authentication Server) + TGS (Ticket Granting Server); Client; Service</text>

  <rect x="24" y="60" width="200" height="26" rx="6" fill="#4f46e5"/>
  <text x="124" y="78" text-anchor="middle" font-size="12" font-weight="700" fill="#ffffff">① AS-REQ/REP · Log in once</text>
  <rect x="24" y="94" width="200" height="120" rx="6" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="34" y="114" font-size="10.5" fill="#3730a3">Client → AS: "I am alice"</text>
  <text x="34" y="132" font-size="10.5" fill="#3730a3">AS → Client: TGT (encrypted with</text>
  <text x="34" y="147" font-size="10.5" fill="#3730a3">TGS key) + Session Key (encrypted</text>
  <text x="34" y="162" font-size="10.5" fill="#3730a3">with key derived from password)</text>
  <text x="34" y="185" font-size="10.5" font-weight="700" fill="#0f766e">→ The password itself never goes online</text>

  <line x1="228" y1="150" x2="256" y2="150" stroke="#475569" stroke-width="1.6" marker-end="url(#kbah1)"/>

  <rect x="260" y="60" width="200" height="26" rx="6" fill="#4f46e5"/>
  <text x="360" y="78" text-anchor="middle" font-size="12" font-weight="700" fill="#ffffff">② TGS-REQ/REP · Every access</text>
  <rect x="260" y="94" width="200" height="120" rx="6" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="270" y="114" font-size="10.5" fill="#3730a3">Client → TGS: Present TGT,</text>
  <text x="270" y="129" font-size="10.5" fill="#3730a3">"I want to access fileserver"</text>
  <text x="270" y="150" font-size="10.5" fill="#3730a3">TGS → Client: Service Ticket</text>
  <text x="270" y="165" font-size="10.5" fill="#3730a3">(encrypted with fileserver key)</text>
  <text x="270" y="180" font-size="10.5" fill="#3730a3">+ New Session Key</text>

  <line x1="464" y1="150" x2="492" y2="150" stroke="#475569" stroke-width="1.6" marker-end="url(#kbah1)"/>

  <rect x="496" y="60" width="200" height="26" rx="6" fill="#4f46e5"/>
  <text x="596" y="78" text-anchor="middle" font-size="12" font-weight="700" fill="#ffffff">③ AP-REQ/REP · Access Service</text>
  <rect x="496" y="94" width="200" height="120" rx="6" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="506" y="114" font-size="10.5" fill="#3730a3">Client → fileserver: Service Ticket</text>
  <text x="506" y="129" font-size="10.5" fill="#3730a3">+ Authenticator (timestamp,</text>
  <text x="506" y="144" font-size="10.5" fill="#3730a3">anti-replay)</text>
  <text x="506" y="165" font-size="10.5" fill="#3730a3">fileserver decrypts ticket → Trust</text>
  <text x="506" y="180" font-size="10.5" fill="#3730a3">KDC endorsement → (optional) AP-REP</text>
  <text x="506" y="195" font-size="10.5" fill="#3730a3">Mutual Authentication</text>

  <rect x="24" y="232" width="672" height="60" rx="8" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="40" y="256" font-size="12.5" fill="#3730a3">The service does not need to contact the KDC or store user passwords to verify the client — as long as it can decrypt the "ticket encrypted with its own key", it proves the ticket was issued by the KDC. The password is only involved in derivation once during login, and never traverses the network afterwards.</text>
</svg>

Why designed this way: The service can verify the client **without contacting the KDC or storing user passwords** — as long as it can decrypt the "ticket encrypted with its own key", it proves the ticket was issued by the KDC. Costs and threats:

- **Clock Synchronization**: Authenticators rely on timestamps to prevent replay attacks; global clock skew usually must be < 5 minutes (hence AD's strong reliance on NTP).
- **KDC is a high-value single point of failure**: Obtaining the `krbtgt` account hash allows forging arbitrary TGTs (**Golden Ticket**); obtaining a service key allows forging that service's tickets (Silver Ticket).
- **Kerberoasting**: Service tickets are encrypted with keys derived from service account passwords. Attackers can request them and brute-force weak passwords for service accounts offline — hence service accounts should use strong random passwords / gMSA.

## LDAP — Directory and Bind Authentication

LDAP (RFC 4511) is primarily a **hierarchical directory** (`cn=alice,ou=users,dc=example,dc=com`), storing people, groups, devices, and their attributes. Its "authentication" is the **bind** operation: presenting a DN + password to the server to exchange for a "pass/fail" result.

<svg viewBox="0 0 720 300" xmlns="http://www.w3.org/2000/svg" font-family="-apple-system,'Source Han Sans CN','Microsoft YaHei',sans-serif" role="img" aria-label="LDAP search-then-bind two-step access and comparison of two bind methods">
  <defs><marker id="ldah1" markerWidth="10" markerHeight="8" refX="8" refY="3" orient="auto"><path d="M0,0 L8,3 L0,6 Z" fill="#475569"/></marker></defs>
  <rect width="720" height="300" fill="#ffffff"/>
  <text x="360" y="28" text-anchor="middle" font-size="17" font-weight="700" fill="#1f2933">LDAP Application Access: search-then-bind two steps</text>

  <rect x="20" y="46" width="330" height="26" rx="6" fill="#4f46e5"/>
  <text x="185" y="64" text-anchor="middle" font-size="12" font-weight="700" fill="#ffffff">① Service Account Bind</text>
  <rect x="20" y="78" width="330" height="50" rx="6" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="34" y="98" font-size="11" fill="#3730a3">Application binds using service account</text>
  <text x="34" y="116" font-size="11" fill="#3730a3">→ searches out alice's full DN</text>

  <line x1="354" y1="103" x2="366" y2="103" stroke="#475569" stroke-width="1.6" marker-end="url(#ldah1)"/>

  <rect x="370" y="46" width="330" height="26" rx="6" fill="#0d9488"/>
  <text x="535" y="64" text-anchor="middle" font-size="12" font-weight="700" fill="#ffffff">② User DN + Password Bind</text>
  <rect x="370" y="78" width="330" height="50" rx="6" fill="#f0fdfa" stroke="#99f6e4"/>
  <text x="384" y="98" font-size="11" fill="#115e59">Then use alice's DN + her entered password</text>
  <text x="384" y="116" font-size="11" fill="#115e59">to perform a bind → success means password is correct</text>

  <text x="360" y="150" text-anchor="middle" font-size="12" font-weight="700" fill="#1f2933">Bind Method Comparison</text>

  <rect x="20" y="164" width="330" height="70" rx="6" fill="#ffedd5"/>
  <text x="34" y="184" font-size="11.5" font-weight="700" fill="#9a3412">simple bind</text>
  <text x="34" y="202" font-size="10.5" fill="#c2410c">DN + plaintext password</text>
  <text x="34" y="218" font-size="10.5" fill="#c2410c">Must run over LDAPS/StartTLS,</text>
  <text x="34" y="233" font-size="10.5" fill="#c2410c">otherwise passwords are exposed</text>

  <rect x="370" y="164" width="330" height="70" rx="6" fill="#ccfbf1"/>
  <text x="384" y="184" font-size="11.5" font-weight="700" fill="#0f766e">SASL bind</text>
  <text x="384" y="202" font-size="10.5" fill="#115e59">GSSAPI (Kerberos) / EXTERNAL (mTLS)</text>
  <text x="384" y="218" font-size="10.5" fill="#115e59">No password transmitted, stronger</text>

  <rect x="20" y="246" width="680" height="42" rx="8" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="34" y="271" font-size="12.5" fill="#3730a3">LDAP itself is not an SSO protocol — it is "credential verification + identity data source", often hidden behind SAML/OIDC/RADIUS as storage.</text>
</svg>

Key positioning: LDAP itself is **not an SSO protocol**; it is "credential verification + identity data source", often hidden behind SAML/OIDC/RADIUS as storage. Active Directory ≈ LDAP (directory) + Kerberos (authentication) + DNS (location) combination.

## SAML 2.0 — Enterprise Web SSO

The browser SSO standard of the XML era (Okta, Azure AD, enterprise intranets). The SP (Service Provider) outsources authentication to the IdP (Identity Provider), which returns a **digitally signed Assertion**.

<svg viewBox="0 0 720 380" xmlns="http://www.w3.org/2000/svg" font-family="-apple-system,'Source Han Sans CN','Microsoft YaHei',sans-serif" role="img" aria-label="SAML 2.0 SP-initiated login flow and key assertion fields">
  <rect width="720" height="380" fill="#ffffff"/>
  <text x="360" y="28" text-anchor="middle" font-size="17" font-weight="700" fill="#1f2933">SAML 2.0 SP-initiated Flow (HTTP Redirect + Form POST Binding)</text>

  <rect x="24" y="46" width="672" height="30" rx="6" fill="#eef2ff" stroke="#c7d2fe"/>
  <circle cx="42" cy="61" r="11" fill="#4f46e5"/><text x="42" y="65" text-anchor="middle" font-size="11" font-weight="700" fill="#ffffff">1</text>
  <text x="62" y="66" font-size="11.5" fill="#3730a3">User → SP: Access protected resource</text>

  <rect x="24" y="84" width="672" height="30" rx="6" fill="#eef2ff" stroke="#c7d2fe"/>
  <circle cx="42" cy="99" r="11" fill="#4f46e5"/><text x="42" y="103" text-anchor="middle" font-size="11" font-weight="700" fill="#ffffff">2</text>
  <text x="62" y="104" font-size="11.5" fill="#3730a3">SP → Browser: Redirect to IdP, carrying AuthnRequest (HTTP-Redirect binding)</text>

  <rect x="24" y="122" width="672" height="30" rx="6" fill="#eef2ff" stroke="#c7d2fe"/>
  <circle cx="42" cy="137" r="11" fill="#4f46e5"/><text x="42" y="141" text-anchor="middle" font-size="11" font-weight="700" fill="#ffffff">3</text>
  <text x="62" y="142" font-size="11.5" fill="#3730a3">IdP verifies user (may reuse existing session) → generates Assertion</text>

  <rect x="24" y="160" width="672" height="30" rx="6" fill="#eef2ff" stroke="#c7d2fe"/>
  <circle cx="42" cy="175" r="11" fill="#4f46e5"/><text x="42" y="179" text-anchor="middle" font-size="11" font-weight="700" fill="#ffffff">4</text>
  <text x="62" y="180" font-size="11.5" fill="#3730a3">IdP → Browser → SP: Auto POST form back Response (HTTP-POST binding)</text>

  <rect x="24" y="198" width="672" height="30" rx="6" fill="#eef2ff" stroke="#c7d2fe"/>
  <circle cx="42" cy="213" r="11" fill="#4f46e5"/><text x="42" y="217" text-anchor="middle" font-size="11" font-weight="700" fill="#ffffff">5</text>
  <text x="62" y="218" font-size="11.5" fill="#3730a3">SP verifies XML signature + conditions → establishes local session</text>

  <rect x="24" y="244" width="672" height="26" rx="6" fill="#0d9488"/>
  <text x="360" y="262" text-anchor="middle" font-size="12" font-weight="700" fill="#ffffff">Key Assertion Fields</text>
  <rect x="24" y="274" width="672" height="92" rx="6" fill="#f0fdfa" stroke="#99f6e4"/>
  <text x="38" y="292" font-size="10.5" fill="#115e59">&lt;Issuer&gt; Who issued it (must be in SP trust list)</text>
  <text x="38" y="309" font-size="10.5" fill="#115e59">&lt;Subject&gt;&lt;NameID&gt; User identifier</text>
  <text x="38" y="326" font-size="10.5" fill="#115e59">&lt;Conditions NotBefore=".." NotOnOrAfter=".."&gt; Validity period → anti-replay</text>
  <text x="38" y="343" font-size="10.5" fill="#115e59">&lt;AttributeStatement&gt; email / groups / role, etc.</text>
  <text x="38" y="360" font-size="10.5" fill="#115e59">&lt;ds:Signature&gt; XML-DSig signature (covers assertion or entire Response)</text>
</svg>

Security points (SAML's pitfalls are almost all in signature verification):

- **XML Signature Wrapping (XSW)**: Attackers shift validly signed elements and inject forged assertions. The SP must strictly verify that "the signature covers exactly the element being trusted" and fix schema parsing — this is the most common source of CVEs in SAML implementations.
- **Must verify** `Audience` (this assertion is for me), `NotOnOrAfter` (not expired), `Recipient` and `InResponseTo` (anti-replay/anti-injection), and treat `NameID` as single-use.
- Why it still survives: Pure browser redirects, no JS required, best compatibility with legacy enterprise IdPs. New projects should prefer OIDC.

## WebAuthn / Passkeys — Phishing-resistant Passwordless

FIDO2/WebAuthn (W3C) replaces passwords with a pair of **asymmetric keys**: the private key is generated and locked in the device's secure element, non-exportable, while the server only stores the public key.

<svg viewBox="0 0 720 300" xmlns="http://www.w3.org/2000/svg" font-family="-apple-system,'Source Han Sans CN','Microsoft YaHei',sans-serif" role="img" aria-label="WebAuthn registration and authentication two-flow comparison">
  <defs><marker id="wbah1" markerWidth="10" markerHeight="8" refX="8" refY="3" orient="auto"><path d="M0,0 L8,3 L0,6 Z" fill="#475569"/></marker></defs>
  <rect width="720" height="300" fill="#ffffff"/>
  <text x="360" y="28" text-anchor="middle" font-size="17" font-weight="700" fill="#1f2933">WebAuthn: Asymmetric key pairs replace passwords, private keys never leave the device</text>

  <text x="24" y="58" font-size="12" font-weight="700" fill="#3730a3">Registration · navigator.credentials.create</text>
  <rect x="24" y="66" width="200" height="66" rx="6" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="34" y="86" font-size="11" font-weight="700" fill="#3730a3">Server</text>
  <text x="34" y="103" font-size="10.5" fill="#3730a3">→ challenge (random)</text>
  <line x1="228" y1="99" x2="252" y2="99" stroke="#475569" stroke-width="1.6" marker-end="url(#wbah1)"/>
  <rect x="256" y="66" width="240" height="66" rx="6" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="266" y="86" font-size="11" font-weight="700" fill="#3730a3">Authenticator</text>
  <text x="266" y="103" font-size="10.5" fill="#3730a3">Generates key pair for (RP ID=example.com),</text>
  <text x="266" y="119" font-size="10.5" fill="#3730a3">private key stays local → returns credential_id</text>
  <text x="266" y="135" font-size="10.5" fill="#3730a3">+ public_key +(optional) attestation</text>
  <line x1="500" y1="99" x2="524" y2="99" stroke="#475569" stroke-width="1.6" marker-end="url(#wbah1)"/>
  <rect x="528" y="66" width="168" height="66" rx="6" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="538" y="86" font-size="11" font-weight="700" fill="#3730a3">Server</text>
  <text x="538" y="103" font-size="10.5" fill="#3730a3">Stores credential_id</text>
  <text x="538" y="119" font-size="10.5" fill="#3730a3">↔ public_key</text>

  <text x="24" y="164" font-size="12" font-weight="700" fill="#0f766e">Authentication · navigator.credentials.get</text>
  <rect x="24" y="172" width="200" height="66" rx="6" fill="#f0fdfa" stroke="#99f6e4"/>
  <text x="34" y="192" font-size="11" font-weight="700" fill="#115e59">Server</text>
  <text x="34" y="209" font-size="10.5" fill="#115e59">→ challenge + allowed</text>
  <text x="34" y="224" font-size="10.5" fill="#115e59">credential_id</text>
  <line x1="228" y1="205" x2="252" y2="205" stroke="#475569" stroke-width="1.6" marker-end="url(#wbah1)"/>
  <rect x="256" y="172" width="240" height="66" rx="6" fill="#f0fdfa" stroke="#99f6e4"/>
  <text x="266" y="192" font-size="11" font-weight="700" fill="#115e59">Authenticator</text>
  <text x="266" y="209" font-size="10.5" fill="#115e59">User verifies (fingerprint/PIN) → signs with private key</text>
  <text x="266" y="225" font-size="10.5" fill="#115e59">(challenge + origin + RP ID)</text>
  <line x1="500" y1="205" x2="524" y2="205" stroke="#475569" stroke-width="1.6" marker-end="url(#wbah1)"/>
  <rect x="528" y="172" width="168" height="66" rx="6" fill="#f0fdfa" stroke="#99f6e4"/>
  <text x="538" y="192" font-size="11" font-weight="700" fill="#115e59">Server</text>
  <text x="538" y="209" font-size="10.5" fill="#115e59">Verifies signature with public key + checks</text>
  <text x="538" y="224" font-size="10.5" fill="#115e59">challenge + origin</text>

  <rect x="24" y="252" width="672" height="34" rx="8" fill="#f0fdfa" stroke="#99f6e4"/>
  <text x="38" y="273" font-size="12.5" fill="#115e59">The signature binds origin/RP ID — the authenticator only recognizes the correct domain, providing phishing resistance that passwords and OTPs cannot.</text>
</svg>

Its **only truly important property is phishing resistance**: the signature binds `origin`/RP ID, and the browser will only use `example.com` credentials for `example.com`. Even if the user is tricked into `examp1e.com`, the authenticator won't find matching credentials and cannot produce a valid signature — a guarantee that passwords, OTPs, and push notifications cannot provide. Other concepts:

- **Attestation**: Proves "this is a genuine authenticator of a specific model"; consumption scenarios generally do not verify this (privacy + compatibility).
- **Discoverable credential (resident key)**: Stores the user handle in the authenticator, enabling login "without entering a username first" — this is the basis of **Passkeys**.
- **Passkey = Syncable discoverable credentials**: Synced across devices via iCloud Keychain / Google Password Manager, greatly improving usability, but trust shifts to that cloud account; pure hardware keys (device-bound) do not sync, are stronger, but are easier to lose.

## RADIUS — Network Access AAA

RADIUS (RFC 2865) does not manage "logging into a website", but rather "**can you access this network**" — WiFi (WPA2/3-Enterprise), VPN, switch ports (802.1X). It performs AAA: Authentication, Authorization, Accounting.

<svg viewBox="0 0 720 350" xmlns="http://www.w3.org/2000/svg" font-family="-apple-system,'Source Han Sans CN','Microsoft YaHei',sans-serif" role="img" aria-label="RADIUS network access AAA architecture and 802.1X three parties">
  <defs>
    <marker id="rdah1" markerWidth="10" markerHeight="8" refX="8" refY="3" orient="auto"><path d="M0,0 L8,3 L0,6 Z" fill="#475569"/></marker>
    <marker id="rdah1s" markerWidth="10" markerHeight="8" refX="2" refY="3" orient="auto"><path d="M8,0 L0,3 L8,6 Z" fill="#475569"/></marker>
  </defs>
  <rect width="720" height="350" fill="#ffffff"/>
  <text x="360" y="28" text-anchor="middle" font-size="17" font-weight="700" fill="#1f2933">RADIUS: AAA Frontend for Network Access Layer</text>

  <rect x="30" y="52" width="230" height="50" rx="8" fill="#e2e8f0"/>
  <text x="145" y="72" text-anchor="middle" font-size="12" font-weight="700" fill="#334155">NAS</text>
  <text x="145" y="90" text-anchor="middle" font-size="10.5" fill="#475569">AP / Switch / VPN Gateway</text>

  <rect x="460" y="52" width="230" height="50" rx="8" fill="#4f46e5"/>
  <text x="575" y="72" text-anchor="middle" font-size="12" font-weight="700" fill="#ffffff">RADIUS Server</text>
  <text x="575" y="90" text-anchor="middle" font-size="10.5" fill="#e0e7ff">Authentication/Authorization/Accounting</text>

  <text x="360" y="63" text-anchor="middle" font-size="10.5" fill="#64748b">UDP 1812/1813</text>
  <line x1="264" y1="77" x2="456" y2="77" stroke="#475569" stroke-width="1.6" marker-end="url(#rdah1)" marker-start="url(#rdah1s)"/>
  <text x="360" y="96" text-anchor="middle" font-size="10.5" fill="#64748b">Shared Secret (NAS ↔ Server)</text>

  <rect x="30" y="118" width="230" height="98" rx="8" fill="#f8fafc" stroke="#e2e8f0"/>
  <text x="42" y="138" font-size="10.5" font-weight="700" fill="#334155">EAP tunnel carries the actual authentication method</text>
  <text x="42" y="160" font-size="10.5" font-weight="700" fill="#166534">EAP-TLS = Certificate mutual authentication (strongest)</text>
  <text x="42" y="182" font-size="10.5" font-weight="700" fill="#9a3412">PEAP/TTLS = Run inside TLS tunnel</text>
  <text x="42" y="200" font-size="10.5" font-weight="700" fill="#9a3412">MSCHAPv2, etc.</text>

  <line x1="575" y1="102" x2="575" y2="166" stroke="#475569" stroke-width="1.6" marker-end="url(#rdah1)"/>
  <text x="590" y="138" font-size="10.5" fill="#64748b">Often queries</text>
  <rect x="460" y="170" width="230" height="46" rx="8" fill="#0d9488"/>
  <text x="575" y="198" text-anchor="middle" font-size="12" font-weight="700" fill="#ffffff">LDAP / AD / Kerberos</text>

  <text x="360" y="242" text-anchor="middle" font-size="12" font-weight="700" fill="#1f2933">802.1X Three Parties</text>
  <rect x="30" y="252" width="190" height="42" rx="8" fill="#e2e8f0"/>
  <text x="125" y="277" text-anchor="middle" font-size="11" fill="#334155">Endpoint (supplicant)</text>
  <line x1="224" y1="273" x2="256" y2="273" stroke="#475569" stroke-width="1.6" marker-end="url(#rdah1)"/>
  <rect x="260" y="252" width="200" height="42" rx="8" fill="#e2e8f0"/>
  <text x="360" y="277" text-anchor="middle" font-size="11" fill="#334155">Switch (authenticator)</text>
  <line x1="464" y1="273" x2="496" y2="273" stroke="#475569" stroke-width="1.6" marker-end="url(#rdah1)"/>
  <rect x="500" y="252" width="190" height="42" rx="8" fill="#4f46e5"/>
  <text x="595" y="277" text-anchor="middle" font-size="11" fill="#ffffff">RADIUS (server)</text>

  <rect x="30" y="306" width="660" height="34" rx="8" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="44" y="327" font-size="12" fill="#3730a3">RADIUS is just the AAA frontend, decoupling the access layer from the identity layer — actual account data remains in LDAP/AD/Kerberos.</text>
</svg>

Key points: RADIUS itself is just an AAA frontend; identity data usually remains in LDAP/AD; it decouples the "access layer" from the "identity layer". When fine-grained authorization and auditing by command are needed (network device operations), use **TACACS+** (per-command authorization, full encryption) instead.

## Selection

| Requirement | Preferred | Key Reason |
|---|---|---|
| AD domain service mutual recognition | Kerberos | Ticket SSO, passwords don't traverse network |
| Internal directory / as backend identity source | LDAP(S) | It is a data source, not SSO, hidden behind other protocols |
| Enterprise Web SSO (legacy IdP) | SAML 2.0 | Pure browser, best compatibility |
| Modern App / Mobile / Federated Login | [OIDC](/networking/12-security-protocols/02-oauth2-and-openid-connect.md) | JSON/JWT, lighter than SAML |
| Phishing-resistant user login | WebAuthn/Passkey | Origin binding, eliminates passwords |
| WiFi / VPN / Port Access | RADIUS + EAP | Network access layer AAA |
| Network device per-command authorization audit | TACACS+ | Fine-grained + full encryption |

In practice, they are layered and used together rather than being mutually exclusive: a typical combination is **WebAuthn/OIDC for user login frontend + LDAP/AD for identity source + Kerberos/RADIUS for intranet and access**.

## References

- **Kerberos**: RFC 4120 · MIT Kerberos Documentation · "Kerberos: The Definitive Guide"
- **WebAuthn**: w3c.github.io/webauthn · webauthn.guide · passkeys.dev
- **SAML**: OASIS SAML 2.0 Core · "On Breaking SAML" (XSW attack paper)
- **Unified Platform**: Keycloak (covers OIDC/SAML/LDAP/Kerberos brokering, worth setting up and reading)

*Keywords: Kerberos, KDC, TGT, Golden Ticket, Kerberoasting, LDAP, bind, SAML, Assertion, XML Signature Wrapping, WebAuthn, Passkey, FIDO2, phishing-resistant, RADIUS, EAP, 802.1X, TACACS+*
