Skip to content
Insights
Request Services
Anti-Patterns
Practitioner catalog · 2026.05

IAM anti-patterns — 35 ways to break your identity stack.

A practitioner-maintained catalog of identity & access management anti-patterns — what they cost, and how to fix them. Each entry has a stable anchor so you can share specific anti-patterns in code review. CC BY 4.0.

Share

Anti-patterns

35

CC BY 4.0 · deep-linkable

AuthenticationAuthorizationSessions & tokensPrivileged accessIdentity governanceCustomer identityFederation / SSOOps & evidence

Authentication

6
  1. #01 Implicit Flow for a single-page app

    #implicit-flow-in-spa

    Problem

    Returning an access token directly in the URL fragment via response_type=token or id_token token.

    Cost

    Tokens leak via browser history, referer headers, analytics scripts, and bookmarks. OAuth 2.1 removed this for a reason.

    Fix

    Authorization Code + PKCE. Every modern SPA framework + IdP supports it.

  2. #02 Resource Owner Password Credentials grant as the default

    #ropc-as-default

    Problem

    Client collects the user's username + password directly and exchanges them at /token with grant_type=password.

    Cost

    Defeats the entire point of OAuth — the third-party app now has the password. Bypasses MFA. Removed in OAuth 2.1.

    Fix

    Authorization Code + PKCE. ROPC was always a migration-only crutch.

  3. #03 Push MFA without number-matching

    #push-mfa-without-number-matching

    Problem

    Tap-to-approve push notifications without showing a number the user must verify in the originating app.

    Cost

    MFA fatigue: attackers spam push prompts until a tired user taps approve. The pattern that compromised Uber, Cisco, MGM.

    Fix

    Number-matching is now a feature in every major MFA platform (Microsoft Authenticator, Okta Verify, Duo Push). Turn it on for privileged users at minimum.

  4. #04 SMS MFA on admin accounts

    #sms-mfa-on-admin-accounts

    Problem

    SMS as the second factor for accounts with privileged access.

    Cost

    SIM swap attacks. NIST 800-63B has discouraged SMS OTP since 2017; modern guidance explicitly requires phishing-resistant factors for privileged users.

    Fix

    FIDO2 / passkeys / hardware security keys for any privileged user. SMS is acceptable for low-risk consumer accounts only.

  5. #05 Shared MFA enrollment across multiple users

    #shared-mfa-enrollment

    Problem

    Multiple users enrolled against one TOTP secret / one hardware token / one phone.

    Cost

    Defeats non-repudiation. Lifecycle break: when one user leaves, all the others lose access too.

    Fix

    One human, one set of enrolled credentials. Service accounts get their own credential strategy.

  6. #06 Strong password policy without compromised-password screening

    #password-policy-without-screen

    Problem

    Enforcing 16-character minimums and complexity rules but not checking against breach corpora.

    Cost

    Users pick strong-looking passwords that were leaked in a prior breach — credential stuffing still works.

    Fix

    Screen against HIBP Pwned Passwords (or equivalent) at password-set time. Modern IdPs offer this as a toggle.

Authorization

4
  1. #07 Role explosion

    #role-explosion

    Problem

    One role per (job × department × team × project) combination. 8K-30K roles in the IGA system.

    Cost

    Nobody can certify the entitlements. Reviewers rubber-stamp. The role model is more noise than signal.

    Fix

    Re-mine roles starting from broad business functions. Use risk-tiered certifications instead of trying to make role-mining perfect.

  2. #08 Authorization via a `roles` claim in the access token

    #authz-via-jwt-roles-claim

    Problem

    Stuffing all permissions into the access token at issue time, then checking them at API call time.

    Cost

    Token bloat (some tokens hit 10KB+). Stale permissions because tokens are long-lived. Tokens become a credential-exposure surface.

    Fix

    Token carries identity + minimal scopes. Authorization queries a policy engine (OPA, Cerbos, OpenFGA) at call time.

  3. #09 Wildcard permissions in policy

    #wildcard-permissions

    Problem

    `s3:*` or `arn:aws:s3:::*` style wildcards in IAM policy.

    Cost

    Audit findings. Privilege escalation paths nobody intended. The cost of wildcard policies is paid only after a breach.

    Fix

    IAM Access Analyzer + least-privilege policy generation from CloudTrail usage. Reduce iteratively.

  4. #10 Application code owns authorization decisions

    #app-owns-authz

    Problem

    `if (user.role === "admin") { ... }` scattered through application code.

    Cost

    No central audit trail. Policy changes require app deploys. Cross-app inconsistency is guaranteed.

    Fix

    External policy decision point. Apps query "can subject X do action Y on resource Z?" and trust the answer.

Sessions & tokens

5
  1. #11 Long-lived access tokens (24h+)

    #long-lived-access-tokens

    Problem

    Access tokens with `exp` set 24h or longer.

    Cost

    A stolen token has a 24h+ blast radius. Refresh-token rotation can't help once the access token is loose.

    Fix

    Access tokens 5-60 minutes. Use refresh tokens for re-issuance. Pair with sender-constrained tokens (DPoP / mTLS) where feasible.

  2. #12 No refresh-token rotation

    #no-refresh-token-rotation

    Problem

    Refresh tokens that remain valid until expiration even if reused.

    Cost

    Refresh-token compromise persists. No signal for the IdP that something is wrong.

    Fix

    OAuth 2.1 refresh-token rotation: every /token call returns a new refresh token, invalidates the old. Reuse of the old = forced session invalidation.

  3. #13 Session cookies without Secure + HttpOnly + SameSite

    #session-cookie-without-secure-flags

    Problem

    Cookies missing one or more of `Secure`, `HttpOnly`, `SameSite=Strict`/`Lax`.

    Cost

    XSS leaks the session. CSRF works. Network attackers see the cookie.

    Fix

    All three flags. SameSite=Lax is the default; use Strict for high-stakes services.

  4. #14 Storing access tokens in localStorage

    #jwt-in-localstorage

    Problem

    JWT tokens in `localStorage` for SPA-side fetch authorization.

    Cost

    XSS exfiltration is trivial. Any third-party script you load can read every token.

    Fix

    HttpOnly cookie or sessionStorage with tight CSP. Backend-for-frontend pattern hides tokens from the browser entirely.

  5. #15 Bearer tokens with no sender constraint

    #no-token-binding

    Problem

    Access tokens that any party holding them can use against any client.

    Cost

    Token theft is full account takeover until the token expires.

    Fix

    DPoP (RFC 9449) or mTLS-bound tokens for high-value APIs. The token becomes useless without the original client's key.

Privileged access

5
  1. #16 Standing domain admin accounts

    #standing-domain-admin

    Problem

    Always-on accounts with Domain Admin / Global Admin / root access.

    Cost

    A compromised endpoint = a compromised domain. The most-cited finding in red-team reports.

    Fix

    Zero standing privilege. JIT elevation via PAM platform with session monitoring + time-bounded grants.

  2. #17 Shared administrator credentials

    #shared-admin-credentials

    Problem

    One `admin` / `root` / `Administrator` credential used by multiple humans.

    Cost

    No non-repudiation. Lifecycle break when anyone leaves. Audit-finding magnet.

    Fix

    Individual privileged accounts vaulted via PAM with personal session attribution.

  3. #18 Service-account credentials in git history

    #service-accounts-in-git

    Problem

    API keys, DB passwords, AWS access keys committed to source control.

    Cost

    Forever-leaked. Even after a rotation, the old credential is in the repo history forever.

    Fix

    Secrets manager (Vault, AWS Secrets Manager, Doppler). Pre-commit hooks (gitleaks, trufflehog). For accidents, BFG Repo-Cleaner + immediate rotation.

  4. #19 Service accounts with no owner

    #untracked-service-accounts

    Problem

    Service / non-human accounts created over years with no documented owner.

    Cost

    Cannot be deprovisioned safely (nobody knows what they call). Accumulate excessive permissions. Most-common vector for lateral movement.

    Fix

    Every service account has a human or team owner in CMDB. Discovery sweep; orphan accounts get a 30-day "claim or we disable" window.

  5. #20 No session recording on production SSH / RDP

    #no-session-recording-on-prod

    Problem

    Privileged sessions on production systems are not recorded or audited.

    Cost

    Incident-response triage is "we don't know what they did." HIPAA / FedRAMP audit findings.

    Fix

    PAM session broker with session recording on all production privileged access. Replay-search the recordings on incident.

Identity governance

5
  1. #21 Annual certification only

    #annual-certification-only

    Problem

    Access certifications run once a year for everyone, regardless of risk tier.

    Cost

    Findings accumulate for 11 months. Reviewer fatigue when 600 entitlements per reviewer all show up at once.

    Fix

    Risk-tiered cadence: high-risk apps quarterly, mid-risk semi-annually, low-risk annually. Event-driven recerts on role change.

  2. #22 Rubber-stamp certifications

    #rubber-stamp-recerts

    Problem

    Reviewers approve 95-99% of entitlements without context — they see a list of usernames and check approve-all.

    Cost

    The certification is theater. The audit finding catches it eventually.

    Fix

    Reviewer kits with last-login, entitlement diff, peer comparison. Risk-rank entitlements so high-risk ones surface first. Outlier highlighting (this user has access nobody else in their role has).

  3. #23 Joiner/Mover/Leaver via tickets

    #manual-jml-via-tickets

    Problem

    New-hire access via ServiceNow ticket. Role change by emailing IT. Termination via a Friday-afternoon email.

    Cost

    Average days-to-provision: 5-15. Average days-to-deprovision: longer. JML is the single biggest audit-finding source.

    Fix

    HRIS-driven automation. Workday / SuccessFactors fires events; IGA provisions in minutes. Termination triggers same-day deprovisioning.

  4. #24 No segregation-of-duties enforcement

    #no-sod-enforcement

    Problem

    SoD is a written policy but not enforced at request time.

    Cost

    A user can hold incompatible roles for months before an audit catches it. Material in regulated environments.

    Fix

    SoD rules in the IGA + access-request flow. Conflict surfaces at request time; resolution requires explicit risk acceptance.

  5. #25 Orphaned accounts after offboarding

    #orphaned-accounts

    Problem

    Terminated employees retain accounts in 30-50% of integrated apps because deprovisioning isn't connected.

    Cost

    Every orphaned account is a re-entry point. Common findings: ex-employees still in Salesforce, Slack, Atlassian months after termination.

    Fix

    Cross-system reconciliation. The IGA periodically reconciles HRIS active set against every connected app and flags orphans.

Customer identity

4
  1. #26 No MFA on consumer accounts

    #no-mfa-on-consumer

    Problem

    Consumer surface protected by password only.

    Cost

    Credential-stuffing has a ~0.5-2% success rate on any reused-password population. ATO becomes inevitable at scale.

    Fix

    Risk-based MFA — challenge on new device / new geo / high-value action. Passkey enrollment for engaged users.

  2. #27 Email-only account recovery on a passkey account

    #email-recovery-on-passkey-account

    Problem

    "Forgot password? Enter your email" recovery flow on an account that's otherwise protected by a phishing-resistant passkey.

    Cost

    Recovery is now the weakest link. Attacker takes over the email; takes over the account. The passkey didn't help.

    Fix

    Pair passkey + backup codes + alternate device. If forced to use email recovery, require additional friction (manual review, device-trust check).

  3. #28 Username enumeration on signup / reset flows

    #username-enumeration-on-signup

    Problem

    Different error messages when an email exists vs doesn't — attacker can map the customer list.

    Cost

    Privacy violation + targeted phishing fuel.

    Fix

    Unified messaging on all account-existence-revealing flows. "If this email is registered, you'll receive an email."

  4. #29 No rate limit on /login or /authorize

    #no-rate-limit-on-login

    Problem

    Endpoint will accept unlimited login attempts.

    Cost

    Trivial credential stuffing. Even bcrypt-hashed passwords can't save you if attackers send millions of attempts.

    Fix

    Per-IP + per-account rate limits. Bot mitigation (Akamai, Cloudflare). CAPTCHA escalation on abuse signals.

Federation / SSO

4
  1. #30 SAML AssertionConsumerServiceURL wildcards

    #saml-wildcard-redirect

    Problem

    SP allows multiple ACS URLs by wildcard (e.g. *.example.com).

    Cost

    A compromised subdomain becomes a SAML assertion exfiltration point. Compounds with sub-domain takeover risk.

    Fix

    Exact-match ACS URLs. No wildcards in SP metadata.

  2. #31 OAuth /authorize with no `state` parameter

    #oauth-no-state-parameter

    Problem

    Client doesn't send + verify the `state` parameter on /authorize.

    Cost

    CSRF on the OAuth callback. The attacker can plant a code that gets exchanged into the victim's session.

    Fix

    High-entropy `state` per /authorize call. Bind it to the user's session (typically signed cookie). Reject callbacks without matching state.

  3. #32 Trusting an ID Token without signature verification

    #no-id-token-signature-verification

    Problem

    RP decodes the ID Token JWT and uses the claims without verifying the signature against the IdP's JWKS.

    Cost

    Anyone can forge an ID Token. The whole OIDC trust model collapses.

    Fix

    Verify signature against the IdP's JWKS for every ID Token. Library defaults usually do this; verify yours does.

  4. #33 Legacy OAuth apps with standing elevated scopes

    #legacy-oauth-apps

    Problem

    OAuth client registrations accumulated over years, each with broad consent + tenant-wide scopes.

    Cost

    Midnight Blizzard / Microsoft 2024: a legacy non-production OAuth app with elevated scopes was the breach vector.

    Fix

    Audit the OAuth grant graph quarterly. Revoke unused. Migrate broad scopes to least-privilege.

Ops & evidence

2
  1. #34 Audit evidence collected manually at quarter-end

    #manual-evidence-collection

    Problem

    Engineers take screenshots of admin panels two weeks before the audit.

    Cost

    Audit is theater. Evidence reflects the moment of capture, not the steady state. Hidden audit-prep cost is enormous.

    Fix

    Evidence-as-code. Continuously emit structured evidence to a long-term store from the IdP / PAM / IGA control plane.

  2. #35 No documented IAM incident runbook

    #no-iam-runbook

    Problem

    When the IdP has an outage or a credential is compromised, the response is improvised.

    Cost

    Incident MTTR is the time to figure out who has access to which dashboards + tools. The cost is highest exactly when it matters.

    Fix

    Documented runbook for each scenario: IdP outage, credential compromise, OAuth app compromise, vault compromise. Tested quarterly.

Fix the ones that matter

We help teams eliminate these in the right order.

Talk to a practice leadMaturity assessment

Identity, cybersecurity, and custom software for regulated enterprises. Audit-ready operations from advisory through audit.

Americas HQ

Wilmington, DE

America/New York

India HQ

Hyderabad, TG

Asia/Kolkata

Services
  • IAM Consulting
  • IAM Technologies
  • Custom Software & AI
  • IAM Staffing
  • Request Services
  • Case Studies
Resources
  • All Resources
  • Complete Guide to IAM
  • IAM Frameworks Compared
  • IAM Certification Roadmap
  • IAM API Hub
  • IAM Explainers
  • IAM Vendor Status
  • Release Notes
  • State of Identity
  • State of PAM
  • State of IGA
  • State of CIAM
  • State of AI Agent Identity
  • IAM Salary Benchmark
  • Vendor Pricing Index
  • Year in Review 2026
  • Acquisition Tracker
  • Outage Tracker
  • Identity Incidents
  • Vulnerability Tracker
  • Cheat Sheets
  • Standards Explainers
  • Migration Playbooks
  • Audit Checklists
  • Reference Architectures
  • RFP Templates
  • IAM Anti-Patterns
  • Compliance Crosswalk
  • Market Landscape
  • Awesome IAM
  • IAM Glossary
  • Compliance Frameworks
  • Integration Guides
  • Vendor Alternatives
  • IAM by Industry
  • Salary Lookup
  • Directory
Research & media
  • IAM Compensation 2026
  • Vendor Moves Q3 2026
  • Identity Incidents Q3 2026
  • Vendor Security Posture 2026
  • Vendor Pricing 2026
  • AI Citation Tracker
  • Top 50 IAM Tools 2026
  • Podcast
  • Videos
  • Newsletter
  • Newsletter Archive
  • Embed Widgets
Free tools
  • JWT Decoder
  • JWT Signer
  • SAML Decoder
  • SAML Metadata Diff
  • OAuth Flow Visualizer
  • OIDC Debugger
  • OIDC Discovery Validator
  • PKCE Generator
  • WebAuthn Tester
  • Bearer Token Inspector
  • SCIM Validator
  • Password Entropy
  • IAM RFP Template
  • PAM Vendor Selector
  • Maturity Assessment
  • ROI Calculator
  • TCO Calculator
  • MFA Bypass Risk
  • Audit-Prep Burden
  • Quizzes
Company
  • About
  • Leadership
  • Approach
  • Why Choose Us
  • Partners
  • Press Kit
  • Press Topics
  • Global Presence
  • Locations
  • Insights
  • Now
  • Community
  • Open Roles
  • Submit Resume
  • Training
  • Contact

© 2026 askmeidentity, Inc.. Safeguard your digital frontier.

  • Privacy Policy
  • Terms of Service
  • Accessibility