Skip to content

Single Sign-On

ShadowMap discovers every Single Sign-On (SSO) and identity-provider integration embedded in your public web applications, attributes each one to a provider and account/tenant identifier, scores its redirect and protocol security, and gives you a triage workflow to approve known integrations or flag rogue ones. It answers a question most teams can't answer from the inside: which authentication endpoints actually exist on my external attack surface, and are any of them shadow IT, deprecated, or misconfigured?

Overview

Single Sign-On

The page is a flat, paginated table — one row per detected SSO login configuration (a sso_login_pages record), not one row per provider. A single provider such as Azure AD or Okta can appear many times if it is wired into multiple applications, with multiple account/tenant IDs, or with multiple redirect URIs.

At the top of the page you get:

  • A metrics strip (six KPI cards) summarising provider count, triage backlog, insecure configurations, and coverage.
  • An analytics panel with a Provider Distribution bar chart and a 30-day Detection Trend line chart (toggle it from the header).
  • Status tabs — Needs Review, Approved, Unauthorized, All — with live counts.
  • A filter bar, a Bookmarked quick toggle, and Export.

Each row carries the provider (with favicon), the account ID, the application it was found on, the redirect URI, a security verdict, a risk level, a review status, and first/last-seen timestamps. Clicking a row opens a detail drawer; the Open full page link in the drawer opens the full provider detail view with per-account, per-application, and per-redirect breakdowns.

How it works

The mechanics below are not visible in the UI but determine what you see and how counts are derived.

Where the data comes from

SSO records are a byproduct of ShadowMap's web-application crawl, not a separate scan. When the crawler renders a discovered web application, it identifies authentication endpoints and SSO buttons/redirects (OAuth 2.0, OpenID Connect, SAML, and similar protocols), then extracts the provider, the account/tenant/client identifier embedded in the integration, the redirect URI, and the favicon. Each detection is stored as one sso_login_pages row tied to the application (http_app_id) and the scan session it was seen in. Because detection rides on the web-app crawl, an SSO record only exists for applications ShadowMap has already discovered and crawled — see Web Applications.

What "live" means (and why counts can differ from the raw table)

Every list, KPI, and provider-detail query is scoped to your most recent completed scan. A record is counted only when:

  • its last_seen_on is at or after the latest scan's start date (it was re-observed in the current scan), and
  • the parent application's status is open, reopened, or newly-discovered — closed/retired applications are excluded.

This is why a provider that was decommissioned shows up only until the next scan no longer finds it, and why the page reflects your current surface rather than all-time history.

Risk Level

Each row gets a risk_level derived from its redirect URI — this is a fast structural heuristic, independent of the deeper security verdict below:

RiskTriggerWhy it matters
CriticalRedirect URI uses http:// (cleartext)Authorization codes/tokens can be intercepted in transit
HighRedirect URI contains a wildcard (*)Open-redirect / token-leak surface in the OAuth flow
LowHTTPS redirect with no wildcardNo structural redirect weakness detected

Security verdict (goblin analyzer)

Separately from the redirect heuristic, ShadowMap's SSO assessment (internally, the goblin analyzer) inspects each configuration and writes a security_status plus a list of structured findings. This is the column that surfaces real protocol-level weaknesses — implicit OAuth flow, missing PKCE/state, cleartext or wildcard redirects, weak SAML configuration, and similar checks. MFA presence is recorded when detectable.

Security badgeMeaning
Insecure (red)A high/critical misconfiguration was found
Weak (amber)Only low/medium findings
Secure (grey)Assessed, no material findings
Not Applicable (grey)Assessment doesn't apply to this configuration
Not Assessed (muted)Not yet evaluated

The list badge shows the verdict plus a finding count (e.g. Insecure · 3); hover to see the finding titles. Per-finding severity is ranked critical > high > medium > low > none, and the provider detail page rolls findings up across all of that provider's records, deduplicated by check ID, and reports the single worst severity.

Review status is per provider, not per row

When you Approve, Flag, or Reset, the status change is applied at the provider level — the backend updates every detection row that shares that provider name for your company — so a verdict on Okta applies to Okta everywhere it appears. Status values are needs_review (default), approved, and unauthorized. The Needs Review / Approved / Unauthorized tab counts in the strip count distinct providers per status, while the All tab and most filters count individual detection rows.

Why this matters

Use caseWhat to look for
Shadow IT discoveryAny provider your IT/identity team doesn't recognise. A Google Workspace or Okta integration on a microsite nobody owns is unmanaged SaaS.
Deprecated endpoint riskOld IdPs that should have been decommissioned (e.g. legacy ADFS after an Azure AD migration). A live login endpoint bypasses current MFA/conditional-access policy.
Configuration driftMultiple account/tenant IDs for the same provider can indicate fragmented identity management across business units.
Coverage gapsApplications with no SSO record may be using local authentication outside centralized identity controls — see the Apps Without SSO card.
Insecure flowsInsecure/Weak security badges and Critical/High risk rows are the redirect and protocol weaknesses to fix first.
M&A / auditThe provider inventory is a continuously-updated authentication-mechanism inventory useful for SOC 2 / ISO 27001 / NIST 800-53 evidence and for due diligence.

Key Metrics

The metrics strip shows six clickable cards. Clicking a card applies the corresponding filter (or, for the two cross-module cards, opens Web Applications).

CardCountsClick behavior
SSO ProvidersDistinct providers in the current scanOpens the All tab
Needs ReviewProviders awaiting triageFilters to Needs Review
UnauthorizedProviders flagged unauthorizedFilters to Unauthorized
Insecure SSORecords with security_status = insecureFilters the list to insecure records
Apps Without SSOLive apps minus apps with an SSO recordOpens Web Applications filtered to sso_providers = "none"
New This WeekRecords first seen in the last 7 daysOpens All scoped to first_seen_on within the last 7 days

Coverage math

Apps Without SSO = (distinct live web applications) − (distinct live applications with at least one SSO record). It is a coverage signal, not a defect list — many apps legitimately use local auth — but it's the fastest way to find applications outside your centralized identity perimeter.

Understanding the Data

Columns are configurable from the column customizer in the page header. Provider is always shown and cannot be hidden.

ColumnDescription
ProviderIdentity provider (e.g. Google, Azure AD, Okta, Auth0, OneLogin), with favicon. Sortable.
Account IDThe client ID, tenant ID, or configuration identifier embedded in the integration. Shown monospace. Sortable.
ApplicationURL of the web application the integration was found on.
Redirect URIThe OAuth/SAML redirect target. HTTP redirects are flagged with a warning icon.
SecurityThe goblin verdict (Insecure / Weak / Secure / Not Applicable / Not Assessed) with finding count. Sortable by underlying security severity.
Risk LevelCritical / High / Low, derived from the redirect URI (see How it works). Sortable.
StatusReview status: Needs Review, Approved, or Unauthorized.
Assigned ToAnalyst the record is assigned to (off by default).
First SeenWhen this configuration was first detected. Sortable.
Last SeenWhen it was last observed in a scan. Sortable.

Switch the status tabs (Needs Review / Approved / Unauthorized / All) for the primary triage cut — tab selection injects a review_status rule into the active filter set, so it composes with everything else you apply.

The filter bar supports these fields:

FilterNotes
ProviderThe SSO provider name
Account IDClient/tenant/config identifier
Review StatusNeeds Review / Approved / Unauthorized
ApplicationThe host/app the integration lives on
Redirect URIMatch on the redirect target
Security SeverityThe goblin per-finding severity
Security StatusInsecure / Weak / Secure / Not Assessed / Not Applicable
Risk LevelCritical / High / Low
Assigned ToThe analyst the record is assigned to
BookmarkedYour bookmarked records
First Seen / Last SeenDate-range filters

The Bookmarked quick toggle (star) in the filter bar restricts the list to records you've bookmarked. Custom tags can be added as filter values where configured.

Detail View

Detail drawer

Click any row to open a side drawer for fast triage without losing your place. It shows the provider identity and review status, the account ID, the application (as a clickable link), the redirect URI (with an HTTP warning), risk level, the security verdict (and an MFA detected chip when applicable), and the full list of security findings with per-finding severity, title, and detail. From the drawer you can Approve, Flag Unauthorized, or Reset to review, and step through records with the prev/next arrows. Open full page jumps to the provider detail view.

Provider detail page

Opening the full page for a provider gives a summary strip — total Account IDs, total Applications, total Redirect URIs (with an HTTP count warning), and First Detected — plus four tabs:

  • Account IDs — every account/tenant/config ID for this provider, with app count and first/last seen. Clicking a row opens Web Applications filtered to that provider and that specific account.
  • Applications — the web applications using this provider, with URL, account ID, and last-scanned date. Clicking opens the application in Web Applications.
  • Redirect URIs — each redirect target with a secure/insecure indicator, protocol (HTTPS/HTTP), and whether it contains a wildcard.
  • Activity — a timeline of first detection, last scan, and any analyst status change.

Taking Action

ActionWhereEffect
ApproveRow drawer, provider page, bulk barMarks the provider as a known, authorized integration
Flag UnauthorizedRow drawer, provider page, bulk barMarks the provider as rogue/unsanctioned for follow-up
Reset to ReviewDrawer, bulk barReturns the provider to Needs Review
AssignBulk barAssign selected records to an analyst (or clear the assignee)
BookmarkRow action, bulk bar, keyboard sSave for later; filter with the Bookmarked toggle
CommentRow actionThreaded comments, with comment templates
ShareRow action, bulk bar, provider pageOpen the integration share modal (row/bulk) or copy a link to the provider page
ExportFilter barExports the current filtered, sorted view

Select rows with the checkboxes (or the header select-all) to reveal the bulk action bar: bulk Approve, Flag, Reset, Assign, Bookmark, and Share across every selected record at once.

Triage workflow

Work the Needs Review tab top-down. Approve providers your identity team recognises, Flag Unauthorized anything they don't, and use Insecure SSO / Critical risk filters to fast-track the configurations that are exploitable today. Approving in bulk by provider clears the backlog quickly because status is provider-scoped.

Keyboard shortcuts

j / k move to the next/previous record (opening the drawer), Enter opens the focused record, Space toggles selection, s bookmarks, and Esc closes the drawer.

Common questions

Is this the list of my logins, or logins on my applications? It's the SSO integrations configured on your web applications — the identity providers your apps delegate authentication to. It is not a list of your employees' accounts.

Why does one provider appear on many rows? Each row is a distinct detection (a sso_login_pages record): the same provider can be wired into many applications, use several account/tenant IDs, or declare multiple redirect URIs. The provider detail page consolidates them.

Why is the count different from what I see in the table? KPI cards and tab badges generally count distinct providers, while the All tab and filters count individual detection rows. Everything is also scoped to your most recent scan and to live (non-closed) applications.

What's the difference between Risk Level and Security? Risk Level is a quick structural read of the redirect URI alone (HTTP = critical, wildcard = high). Security is the deeper analyzer verdict covering protocol-level weaknesses (implicit flow, missing PKCE/state, weak SAML, etc.) with individual findings.

Why is a provider "Not Assessed"? The security analyzer hasn't evaluated that configuration yet (or the schema/assessment hasn't run for it). The record is still inventoried; it just lacks a security verdict for now.

Does Approve/Flag change anything in my identity provider? No. It's an internal triage label in ShadowMap. Use it to track which detected integrations you've vetted and which need investigation or takedown — remediation happens in your IdP.

How do I find apps that aren't using SSO at all? Click the Apps Without SSO card; it opens Web Applications filtered to applications with no detected SSO provider.

  • Web Applications — the source of SSO detections; drill-downs from this page land here, pre-filtered by provider/account.
  • Technology Stack — the broader set of technologies and integrations fingerprinted on your applications.
  • JS Trackers — another class of third-party integrations embedded in your web properties.
  • SSL Certificates — certificate posture for the same applications hosting these login endpoints.
  • Members — manage analyst accounts and roles for assigning and triaging SSO records.

ShadowMap - External Attack Surface Management