Adaptive Authentication & Behavioral Biometrics
Every security team faces the same impossible balancing act. Lock things down too tightly, and employees find workarounds: sharing credentials, writing passwords on sticky notes, calling the helpdesk again and again. Loosen the controls, and you wake up to a breach notification. For decades, authentication has been a binary gate. You either pass the check or you don't. That model is broken, and adaptive authentication is how we fix it.
This chapter takes apart the static authentication model and builds up the concepts behind risk-based adaptive authentication. It then shows how behavioral biometrics adds a continuous trust layer, and walks through implementation patterns for enterprise environments. If you are deploying passkeys, or any passwordless technology, adaptive authentication is not optional. It is the intelligence layer that makes everything else work.
The Friction Problem: Security vs. Usability
Static authentication treats every login the same. An employee accessing their email from a company laptop at headquarters at 10 AM gets the same challenge as someone logging in from an unrecognized device in a foreign country at 3 AM. That is not security. It is theater.
The pattern I see repeatedly is a paradox. Over-secured environments do not achieve the best security outcomes, because human behavior undermines the controls. Under-secured environments are easy to use and easy to break into. The illustrative comparison below shows the shape of the trade-off; the values are directional, not survey data.
| Dimension (illustrative) | Over-secured environment | Under-secured environment |
|---|---|---|
| Helpdesk load from authentication | High | Low |
| Time spent signing in | Long | Short |
| Users finding workarounds | Common | Rare |
| Account takeover risk | Lower, but eroded by workarounds | High |
| Actual security posture | Moderate | Weak |
When you force MFA on every single action, users develop "MFA fatigue." They approve push notifications without looking and leave sessions open indefinitely. CISA warns that attackers exploit exactly this habit through push bombing.
MFA fatigue is not a theoretical risk. In the 2022 Uber breach, the attacker kept sending MFA requests until a contractor accepted one. Over-triggering MFA trains users to approve without thinking, the exact opposite of what security requires.
What Adaptive Authentication Actually Is
Adaptive authentication, also called risk-based authentication or continuous adaptive trust, adjusts the authentication challenge based on contextual risk signals. Instead of a static policy that says "always require MFA," an adaptive system evaluates the risk of each authentication attempt in real time and responds proportionally.
Low risk? Let the user through with just a passkey tap. Medium risk? Ask for a second factor. High risk? Block the attempt and alert the security team. The key insight is that the vast majority of legitimate authentications are low risk, and treating them as such dramatically improves the user experience without weakening security.
Think of it like airport security. A frequent flyer with TSA PreCheck, traveling on a domestic route they fly weekly, gets expedited screening. A first-time international traveler with a one-way ticket purchased in cash gets additional scrutiny. Both approaches are appropriate to their respective risk levels.
The goal of adaptive authentication is not to eliminate friction. It is to put friction where the risk is.
Risk Signals and Scoring
An adaptive authentication engine is only as good as the signals it consumes. The richer your signal set, the more accurate your risk assessments become. Here are the primary categories of risk signals that enterprise implementations should evaluate.
Signal Categories
Location signals include IP geolocation, GPS coordinates (on mobile), and proximity to known office locations. A login from the company's headquarter city is lower risk than one from a country where the organization has no operations.
Device signals encompass device fingerprinting, OS version, browser version, whether the device is managed or unmanaged, and whether it has been seen before. A recognized, managed device with up-to-date patches is low risk. An unknown device with an outdated browser is higher risk.
Temporal signals examine when the authentication attempt occurs relative to the user's normal patterns. An employee who always works 8 AM to 6 PM attempting to log in at 2 AM is anomalous.
Network signals evaluate the network the user connects from: corporate VPN, known home IP, public Wi-Fi, a Tor exit node, or a VPN service often associated with threat actors.
Behavioral signals look at how the user interacts with the authentication flow: typing speed, mouse movements, and whether the pattern matches historical behavior.
Impossible travel detection is one of the most powerful signals. If a user authenticated from New York at 2:00 PM and someone attempts to authenticate as that user from Singapore at 2:30 PM, the laws of physics make that impossible. That is an automatic high-risk flag.
The Risk Scoring Model
Building an effective risk scoring model requires weighting signals appropriately. Here is my working reference model. Treat the weights as a starting point and tune them against your own data:
| Signal | Weight | Low Risk (0 points) | Medium Risk (3-5 points) | High Risk (8-10 points) |
|---|---|---|---|---|
| Device recognition | 20% | Known, managed device | Known but unmanaged | Unknown device |
| Location | 18% | Office or home location | Same country, new city | Foreign country, no operations |
| Impossible travel | 15% | No conflict | Unlikely but possible (fast travel) | Physically impossible |
| Network | 12% | Corporate network/VPN | Residential ISP | Tor/anonymizer/flagged VPN |
| Time of access | 10% | Within normal hours | Slightly outside pattern | Far outside pattern (3 AM) |
| User behavior pattern | 10% | Matches historical pattern | Minor deviations | Significant anomaly |
| Failed attempt history | 8% | No recent failures | 1-2 recent failures | 3+ failures in short window |
| Session context | 7% | Normal session flow | Unusual navigation pattern | Automated/scripted behavior |
The composite score maps to authentication actions:
- Score 0-20 (Low Risk): Passkey authentication only, no additional challenge
- Score 21-50 (Medium Risk): Step-up to a second factor (biometric verification, push notification)
- Score 51-75 (High Risk): Require strong second factor + notify security team
- Score 76-100 (Critical Risk): Block authentication, require administrator intervention
Start with generous thresholds and tighten over time. If you launch with aggressive scoring, you will generate a flood of false positives, frustrate users, and lose organizational trust in the system before it has a chance to prove its value.
Behavioral Biometrics Explained
Behavioral biometrics takes risk assessment beyond contextual signals and into the realm of how a person interacts with their device. Unlike physical biometrics (fingerprints, face scans), behavioral biometrics analyze patterns that are distinctive to an individual and hard to steal or replicate.
Key Behavioral Modalities
Keystroke dynamics measure the timing between key presses (flight time), how long each key is held (dwell time), and the patterns of common key combinations. Most people have a recognizable typing rhythm. Academic studies report high accuracy for keystroke dynamics in controlled settings, but results vary widely with data quality and population, so treat it as one signal among several.
Mouse movement patterns capture velocity, acceleration, curvature, and click patterns. Humans do not move a mouse in straight lines. We follow characteristic curves that are fairly consistent for each person and differ between people.
Touchscreen interaction on mobile devices adds pressure sensitivity, swipe velocity, finger angle, and multi-touch coordination patterns. These signals are particularly rich because smartphone sensors provide high-resolution data.
Gait analysis uses accelerometer and gyroscope data from smartphones to identify users by how they walk. While primarily useful as a continuous authentication signal rather than a login-time signal, gait analysis can maintain a trust level throughout a session when the device is being carried.
How It Works Technically
The behavioral biometrics pipeline follows a well-established pattern:
[Continuous Data Collection] → [Feature Extraction] → [ML Model Inference] → [Risk Score]
↓ ↓ ↓ ↓
Raw sensor events Statistical features Trained classifier 0.0 to 1.0 score
(timestamps, coords, (mean, std dev, (typically ensemble integrated into
pressure, velocity) frequency domain) or neural network) risk engine
Step 1, data collection: JavaScript SDKs or native mobile libraries capture raw interaction events. On web applications, this means keydown/keyup timestamps, mousemove coordinates, and scroll events. On mobile, it includes touch events plus sensor data from accelerometers and gyroscopes.
Step 2, feature extraction: Raw events are transformed into meaningful features. For keystroke dynamics, this might produce a vector of 50-200 features: average dwell time per key, average flight time between common digraphs, typing speed variance, error rate, and backspace frequency. For mouse dynamics, features include average velocity, curvature distribution, click precision, and pause patterns.
Step 3, model inference: The feature vector is compared against a user-specific behavioral profile. Most production systems use ensemble models (random forests, gradient boosted trees) for their balance of accuracy and interpretability. Some vendors use recurrent neural networks or autoencoders for anomaly detection. The model outputs a confidence score between 0.0 (definitely not this user) and 1.0 (definitely this user).
Step 4, risk score integration: The behavioral confidence score becomes one more input into the overall adaptive risk engine, weighted alongside device, location, and temporal signals.
As a rule of thumb, plan for several sessions of interaction data before a behavioral profile is reliable. During that period, run the system in "learning mode" and never make blocking decisions on behavioral signals alone. Ask your vendor for its own warm-up figures and test them.
Privacy-Preserving Approaches
Behavioral biometrics raises legitimate privacy concerns. Users rightly want to know: are you watching everything I type? Responsible implementations address this head-on with architectural choices that protect privacy by design.
On-device processing keeps raw behavioral data on the user's device. Feature extraction and initial model inference happen locally, and only the resulting risk score (a single number) is transmitted to the server. Apple's approach with on-device machine learning in iOS provides a model for this pattern.
Behavioral hashing transforms behavioral features into irreversible hashed representations before transmission. Similar to how you would never store a password in plaintext, behavioral templates should be stored as mathematical representations that cannot be reversed to reconstruct the original behavior patterns.
No raw biometric storage is a non-negotiable requirement. Your system should never store raw keystroke logs, mouse movement recordings, or sensor data beyond the brief window needed for feature extraction. Retention policies should be aggressive: process and discard.
Transparency and consent matter enormously. Users should know that behavioral analysis is occurring, understand what data is collected, and have the ability to opt out (with the understanding that opting out may require alternative verification methods).
Step-Up Authentication Triggers
Not every risk signal warrants the same response. Step-up authentication, which prompts for more verification mid-session, should be triggered by specific events tied to how sensitive the action is.
| Trigger Event | Recommended Step-Up | Rationale |
|---|---|---|
| Accessing financial data or initiating transfer | Strong biometric + confirmation | Financial actions are irreversible |
| Changing account security settings | Re-authentication with passkey | Prevents attacker persistence |
| Accessing PII/PHI records outside normal scope | Manager approval + re-authentication | Regulatory requirement and anomaly |
| First access from new device | Device registration + second factor | Establishes device trust |
| Behavioral anomaly score exceeds threshold | Transparent challenge (e.g., CAPTCHA) | Catches session hijacking |
| Impossible travel detected mid-session | Full re-authentication + security alert | Strong indicator of compromise |
| Elevated privilege operation (admin actions) | Hardware security key or passkey | Protects crown jewels |
Implementation Patterns
The three patterns below are illustrative composites of designs I have seen work. They are not reports from named organizations, and the numbers in them are design parameters, not results.
Banking: High-Risk Transaction Triggers
A retail bank evaluates dozens of risk signals per sign-in. For routine account viewing, a passkey alone is enough. Wire transfers above a set threshold trigger biometric re-verification plus a short confirmation delay. Sessions with a behavioral anomaly trigger a callback from the fraud team before any transaction can proceed.
The design insight is organizational as much as technical. Reducing friction for the large majority of normal interactions is what earns the internal support to increase friction for the small share of risky ones.
SaaS: Unusual Location Triggers
A SaaS company applies location-aware adaptive authentication to its admin console. An administrator signing in from a recognized location and device gets the full admin panel with a passkey alone. The same admin signing in from a new city gets read-only access until they complete step-up verification. Sign-ins from countries on the company's restricted list are blocked, and the security team gets an email.
Healthcare: Sensitive Record Access
A hospital network uses behavioral signals as a continuous trust layer. Clinicians sign in with passkeys at the start of a shift, and the engine monitors interaction patterns passively. Opening patient records outside the clinician's own department, a common insider-threat pattern, requires re-authentication. If the behavioral profile deviates sharply, which suggests someone else is using an unlocked workstation, the session is suspended.
Integration with Passkeys
Passkeys provide strong authentication at the front door. Adaptive authentication and behavioral biometrics provide continuous verification throughout the session. Together, they create a layered defense that is both more secure and more user-friendly than traditional MFA.
The integration model works like this:
- Initial authentication: User authenticates with a passkey (FIDO2/WebAuthn). The adaptive engine evaluates contextual signals and assigns a baseline risk score.
- Session establishment: If the risk score is low, the session is established with full privileges. If medium, limited privileges are granted until step-up is completed.
- Continuous monitoring: Behavioral biometrics runs throughout the session, continuously validating that the person using the device matches the person who authenticated.
- Event-driven step-up: Specific high-sensitivity actions trigger additional verification, calibrated by the current behavioral confidence score.
In this model, a legitimate user on their normal device, in their normal location, may go a whole workday without an extra prompt. An attacker who somehow got hold of that user's unlocked device should be flagged quickly by behavioral anomalies.
Practical Code Example: A Simple Risk Scoring Engine
Below is a simplified risk scoring engine that demonstrates the core concept. Production implementations will be more sophisticated, but this captures the architectural pattern.
from dataclasses import dataclass
from enum import Enum
from typing import Optional
import math
class RiskLevel(Enum):
LOW = "low"
MEDIUM = "medium"
HIGH = "high"
CRITICAL = "critical"
@dataclass
class AuthContext:
user_id: str
device_fingerprint: str
ip_address: str
latitude: float
longitude: float
timestamp: float # Unix timestamp
user_agent: str
is_managed_device: bool
is_tor_exit: bool
failed_attempts_last_hour: int
class AdaptiveRiskEngine:
def __init__(self, user_profile_store, geo_service):
self.profiles = user_profile_store
self.geo = geo_service
def score(self, ctx: AuthContext) -> tuple[float, RiskLevel]:
signals = {}
# Device recognition (weight: 20%)
known_devices = self.profiles.get_known_devices(ctx.user_id)
if ctx.device_fingerprint in known_devices and ctx.is_managed_device:
signals['device'] = 0
elif ctx.device_fingerprint in known_devices:
signals['device'] = 4
else:
signals['device'] = 9
# Location analysis (weight: 18%)
home = self.profiles.get_home_location(ctx.user_id)
distance_km = self._haversine(
home.lat, home.lon, ctx.latitude, ctx.longitude
)
if distance_km < 50:
signals['location'] = 0
elif distance_km < 500:
signals['location'] = 4
else:
signals['location'] = 8
# Impossible travel (weight: 15%)
last_auth = self.profiles.get_last_auth(ctx.user_id)
if last_auth:
travel_distance = self._haversine(
last_auth.latitude, last_auth.longitude,
ctx.latitude, ctx.longitude
)
time_diff_hours = (ctx.timestamp - last_auth.timestamp) / 3600
max_possible_km = time_diff_hours * 900 # ~jet speed
if travel_distance > max_possible_km and time_diff_hours < 24:
signals['impossible_travel'] = 10
else:
signals['impossible_travel'] = 0
else:
signals['impossible_travel'] = 0
# Network (weight: 12%)
if ctx.is_tor_exit:
signals['network'] = 10
else:
signals['network'] = 0
# Failed attempts (weight: 8%)
if ctx.failed_attempts_last_hour >= 3:
signals['failed_attempts'] = 9
elif ctx.failed_attempts_last_hour >= 1:
signals['failed_attempts'] = 4
else:
signals['failed_attempts'] = 0
# Weighted composite score
weights = {
'device': 0.20, 'location': 0.18,
'impossible_travel': 0.15, 'network': 0.12,
'failed_attempts': 0.08
}
composite = sum(
signals[k] * weights[k] * 10 for k in weights
)
# Map to risk level
if composite <= 20:
level = RiskLevel.LOW
elif composite <= 50:
level = RiskLevel.MEDIUM
elif composite <= 75:
level = RiskLevel.HIGH
else:
level = RiskLevel.CRITICAL
return composite, level
@staticmethod
def _haversine(lat1, lon1, lat2, lon2):
R = 6371 # Earth radius in km
dlat = math.radians(lat2 - lat1)
dlon = math.radians(lon2 - lon1)
a = (math.sin(dlat/2)**2 +
math.cos(math.radians(lat1)) *
math.cos(math.radians(lat2)) *
math.sin(dlon/2)**2)
return R * 2 * math.asin(math.sqrt(a))
This engine evaluates five signal categories, weights them, and produces a composite risk score that maps to an action level. In production, you would add behavioral biometrics scores, time-of-day analysis, session context, and integrate with your policy engine for automated step-up decisions.
Common Mistakes
Over-triggering MFA. If more than 10% of legitimate authentications trigger a step-up challenge in the first month, your thresholds are too aggressive. You will create the exact MFA fatigue you are trying to eliminate. Start permissive, analyze the data, and tighten gradually.
Under-triggering. Conversely, if your adaptive engine never triggers a challenge, it is not providing value. My working target is a 3% to 8% step-up rate for a typical enterprise user population. If you are below that, your risk model is likely missing signals.
Ignoring accessibility. Behavioral biometrics models trained on able-bodied users will flag users with motor disabilities, tremors, or who use assistive technology. Your model must account for diverse interaction patterns, and your step-up methods must include accessible alternatives (not just "tap your phone screen").
Treating the model as static. User behavior evolves. Someone who gets a new laptop, changes their commute, or starts working different hours will trigger false positives if the model does not adapt. Implement continuous profile updates with a decay function that weights recent behavior more heavily.
Skipping the learning period. Deploying adaptive authentication in enforcement mode on day one, before the system has baseline profiles, guarantees chaos. Budget at least two to four weeks in observation-only mode, and communicate the timeline to stakeholders.
Never use behavioral biometrics as the sole authentication factor. It is a confidence signal, not an authenticator. A behavioral score of 0.95 means "this is probably the right person." It does not replace the cryptographic proof that passkeys and other authenticators provide.
Bringing It All Together
Adaptive authentication and behavioral biometrics transform passwordless deployment from a binary gate into an intelligent, continuous trust system. The passkey proves that someone possesses the right credential. The adaptive engine evaluates whether the context makes sense. Behavioral biometrics validates that the right human is behind the device. Together, these layers provide security that is simultaneously stronger than passwords-plus-MFA and less disruptive to users.
The organizations that get this right do more than improve their security posture. They change the relationship between their employees and their security infrastructure. Authentication stops being an obstacle and starts being invisible. That is the goal.
For more on the machine learning techniques behind adaptive authentication, including vendor comparison frameworks and deployment architectures, see the complete guide: AI-Powered Adaptive Authentication and Behavioral Biometrics Guide 2026.