ENCA β Conditional Access Baseline Tools
Sign in with your Microsoft Entra account to browse, document, analyze and back up your Conditional Access baseline β including the newest policy settings.
Runs entirely in your browser β no policy data leaves your session.
Reading your tenantβ¦
Fetching Conditional Access policies
What do you want to do?
π Explore & document
Read your baseline and turn it into something shareable.
List Policies
Browse all Conditional Access policies as cards, a list or a settings matrix β grouped by persona.
Create documentation
Select policies (or take all) and generate documentation β Word, PDF, PNG or a PNG bundle.
Backup (JSON)
Select policies (or take all) and download their raw JSON definitions in a zip.
π Analyse & simulate
Work out what your policies actually do, and to whom.
Gap analyse
Users Γ policies impact matrix: who bypasses what and why, risky exclusions, MFA gaps.
Best-practice & bypass checks
Check the baseline against known CA bypasses and the Swiss-cheese model β MFA coverage, FOCI token sharing, break-glass coverage, known bypass apps, persona Γ control matrix.
CA validator NEW
Per policy, the sign-in simulations it implies β user, app, client, location, platform, risk β and the control each one should (or should not) enforce. Ported from Jasper Baes' CA Validator.
What-If NEW
Simulate a sign-in β user, app, platform, client, location, device state and risk β and see which policies would apply, with the controls required, and which would not and why.
Exclusion analyzer
Every exclusion across all policies β users, groups (expanded to members), roles, guest types, apps and locations β in an exclusion Γ policy matrix.
Change audit NEW
Who changed which Conditional Access resource, when, and exactly what changed β a field-level diff of every policy, named location and authentication strength edit from the Entra audit log.
𧬠Compare against a baseline
Measure this tenant against a reference set of policies.
Baseline Policies
Match this tenant against the Limon-IT R26.6 (v3.x) baseline: which baseline policies are present, outdated or missing β then import the gap.
Baseline (Joey Verlinden)
Match this tenant against the community Conditional Access Baseline by Joey Verlinden (2026.6.1) β same view, different catalog.
MS Learn checks
Check policies against documented Microsoft Learn exclusions & limitations β break-glass, token protection, Teams Rooms, retirements.
βοΈ Manage the tenant
The tools that write. Each one confirms before it changes anything.
Conditional Access groups
Check the baseline groups against this tenant, create the missing ones, analyze their members in a matrix, and assign them to policies. writes to tenant
Named locations BETA
View, create, edit and delete Conditional Access named locations β IP ranges and countries β and see which policies use each one. writes to tenant
Set Policy state
Switch selected policies between On, Report-only and Off. writes to tenant
Import
Restore a backup (zip or folder): dependencies first, policies imported Off, includes remapped to deploy persona groups. writes to tenant
β Help
What's new
Everything added or changed in ENCA, newest first β the full changelog behind the overlay you get after signing in.
Help
How every tool works and what to expect from each option β opens in its own tab, jump back to any tool anytime.
π About these tools
ENCA (Entra Conditional Access) is a read-only toolset for your Microsoft Entra Conditional Access baseline. List Policies shows every policy as cards, a list or a settings matrix, grouped by persona (CA number ranges). Create documentation turns all or selected policies into shareable documentation β Word, PDF, PNG or a PNG bundle. Gap analyse builds a users Γ policies impact matrix: which policies apply to whom, who bypasses a policy via exclusions (and why), whether a bypass is covered elsewhere, and who gets no MFA from any policy. Best-practice & bypass checks checks the baseline against known CA bypasses and the Swiss-cheese defense model β MFA coverage, FOCI token sharing, resource-exclusion scope leaks, break-glass coverage, known bypass apps, and a persona Γ control coverage matrix. Baseline Policies matches this tenant against the Limon-IT R26.6 (v3.x) baseline on the CA number and compares versions, so you see at a glance which baseline policies are present, outdated or missing β with a Markdown gap report and a hand-off to Import. MS Learn checks compares your policies against exclusions, limitations and upcoming behavior changes documented on learn.microsoft.com β missing break-glass exclusions, token protection limits, Teams Rooms / Surface Hub impact, required app exclusions and control retirements β and can build the corrected policy for you (new version, state Off, downloadable; never written to your tenant). Backup downloads the raw JSON definitions of your policies in one zip. Conditional Access groups is the one place the groups live: it checks the tenant against the expected baseline set, creates the missing ones, reads their members into a members Γ groups matrix, and assigns them to policies (replace, add, or set to All Users) β always behind an explicit review step.
Permissions
The app uses delegated, read-only Microsoft Graph permissions for its base tools, consented once per tenant by an administrator β
see the permission overview above for the exact scopes and their live status.
The read-only tools never write to your tenant, and the signed-in user only needs a reader role such as Security Reader or Global Reader.
The Conditional Access groups tool additionally requests Policy.ReadWrite.ConditionalAccess on demand (incremental consent) and requires a role
that can edit Conditional Access, such as Conditional Access Administrator or Security Administrator.
Creating missing groups (assigned groups always role-assignable; dynamic groups keep their membership rule) additionally requests
Group.ReadWrite.All and RoleManagement.ReadWrite.Directory and requires the Privileged Role Administrator role.
Credits & thanks
These community projects shaped the tools, and all deserve the credit:
- idPowerToys β by Merill Fernando. The Conditional Access documenter that started all of this: the idea that a CA baseline should be readable as a document rather than clicked through in the portal. These tools are the web successor to that documenter, extended to the newest CA settings.
- Conditional Access Impact Matrix β by Jasper Baes. The users Γ policies impact model behind the Gap analyse tool: working out which policies actually apply to a given user, who bypasses a policy through an exclusion, and whether that bypass is covered somewhere else.
- Conditional Access Validator β by Jasper Baes, part of his Conditional Access Blueprint. The simulation generator behind the CA validator tool: deriving, per policy, the sign-in scenarios it implies and the control each one should (or should not) enforce. Reimplemented here as a report only (no Maester test-code generation). Licensed CC BY-NC-SA 4.0.
- Conditional Access Baseline β by Joey Verlinden. A minimised community baseline on top of the Microsoft Conditional Access framework, included here as a second catalog in Baseline Policies so a tenant can be measured against it the same way. The policy set and naming convention are his; these tools only read and compare.
- CA Policy Analyzer β by jhope188. The inspiration for the Best-practice & bypass checks set: best-practice and known-bypass checks laid out against the Swiss-cheese layered-defense model.
- Audit Conditional Access Exclusions with PowerShell β by Tiago S. Carvalho. The governance flag patterns behind the Risk review in the Exclusion analyzer: privileged roles excluded, all-guest exclusions, direct user exclusions, oversized exclusion lists, stale disabled accounts and report-only exclusions.
- Microsoft Entra Conditional Access blog series β by Sebastian F. Markdanner (Chance of Security). A deep, practical walk-through of designing a persona-based Conditional Access framework; several of his policy designs also informed the Limon-IT baseline bundled here.
All are independently reimplemented here in browser-side JavaScript against Microsoft Graph β no code was copied. Thanks also to the Conditional Access community whose baselines this tool is designed to compare against: Kenneth van Surksum, Joey Verlinden, Sebastian F. Markdanner and Claus Jespersen (Zero Trust persona framework).
Security
Everything runs in your browser β there is no backend and your policy data is never stored or sent anywhere except Microsoft Graph.
Sign-in uses Microsoft Entra (MSAL, authorization code flow with PKCE, no client secret); tokens live in session storage and are gone when the tab closes.
Access tokens are only ever attached to graph.microsoft.com (hostname-validated), a strict Content-Security-Policy is enforced,
and all JavaScript libraries are self-hosted β nothing loads from third-party CDNs at runtime.
Exports are generated locally on your machine and carry your tenant's branding, not Limon-IT's.
π What's new
Everything added or changed in ENCA, newest first. The overlay after sign-in shows you only what landed since your last visit β this is the full record.
β How to use ENCA
A read-only toolset for your Microsoft Entra Conditional Access baseline. Sign in gives read-only Graph access; the four tools that can change your tenant are marked writes to tenant and ask for extra permission only when you run them. Every write lands safely β imported policies come in Off, deletes need a typed confirmation.
π List Policies
Browse every Conditional Access policy, grouped by persona (the CA-number range in the name: Global 000β099, Admins 100β199, Internals 200β299, and so on).
- Cards / List / Settings matrix β Cards show each policy in full; List is a compact one-line-per-policy view; the Settings matrix is a policies Γ settings grid for spotting differences at a glance. The matrix has a full-screen button.
- Search β filter by CA number, policy name or persona.
- Select policies (checkboxes) β a green action bar appears: send the selection straight to Documentation, Backup, Assign groups, Set state or Delete.
- Per-card quick actions β Documentation, Backup, Assign groups and Policy state, scoped to that one policy.
- Apply flow (per persona) β a visual of what actually applies to a persona, including Global policies in scope and honouring exclusions (an excluded persona group drops the policy from the flow).
- π§Ή Housekeeping β appears only when there is something to clean: policies that are Off while a higher version of the same CA number also exists, i.e. the old versions a match & replace import left behind as your rollback. It lists each one next to the policy that superseded it; the ones you tick go through the normal delete flow (JSON backup + typed
DELETE).
Read-only. Nothing changes until you open a write tool from the action bar.
π Create documentation
Turn all or selected policies into shareable documentation with Limon-IT branding.
- Word (.docx) β an editable document, one section per policy.
- PDF β the same, print-ready.
- PNG β a single image of the selection.
- PNG bundle β a zip with one image per policy.
Produces a download. Nothing is written to the tenant.
π Gap analyse
A users Γ policies impact matrix: who is in scope for what, who bypasses a policy and why.
- Group filters β narrow the matrix columns to the policies that target chosen groups.
- Apply flow β the same per-persona flow as in List Policies.
- Export β a standalone HTML report you can open outside the tool.
Read-only.
π‘ Best-practice & bypass checks
Checks the baseline against known Conditional Access bypasses and the Swiss-cheese model.
- MFA coverage, FOCI token-sharing, break-glass coverage, known bypass apps, and a persona Γ control coverage matrix.
- Each finding has a severity and an explanation; a deployed-but-Off policy is flagged as not yet enforcing.
- Export MD β the findings as Markdown for a ticket or review.
Read-only.
β‘ CA validator NEW
For each enabled policy, the sign-in simulations it implies β the combinations of user, application, client app, location, device platform and risk it targets β and, per grant control, the control each one should enforce.
- Expected control β every simulation shows the control the policy would require (MFA, Block, Compliant device, β¦). When the principal, app, location or platform is on the excluded side, the expectation inverts to βno <control>β β proving the policy does not fire there.
- Run against a target β optionally enter a user (UPN) or a persona group (name or ID) to scope the report to only the policies that actually apply to that principal (include minus exclude); for a user, their group and role memberships are evaluated. Leave empty to simulate every policy.
- Include report-only β off by default; tick it to also simulate policies in report-only mode.
- Filter & search β filter by expected control, or search by policy or simulation text; collapse/expand all policies.
- Users are shown as representative placeholders (βall usersβ, βmembers of <group>β, βrole: β¦β) β no individual accounts are sampled. Session-only policies are listed as having nothing to assert.
Read-only. Ported from Jasper Baes' Conditional Access Validator (CC BY-NC-SA 4.0); the Maester test-code generation is not included.
π§ͺ What-If NEW
Simulate one sign-in and see exactly which policies would hit it β the same idea as the Entra portal's What If tool.
- Required conditions β user, target resource, device platform and client app. Everything else (IP, country, device state, sign-in/user/insider risk, authentication flow) is optional.
- Policies that apply β each with the grant controls (and/or) and session controls that must be satisfied. A verdict line at the top says whether access ends up blocked or granted-with-controls.
- Policies that do not apply β each with the first condition that wasn't met (user excluded via a group, wrong client app, location out of scope, β¦).
- Unspecified conditions β if a policy scopes something your scenario leaves blank (say sign-in risk), it can't be evaluated and so does not apply. Fill the field in to test it, exactly as the Microsoft evaluation API behaves.
- App groups don't match β a policy targeting the Office 365 group won't match by design; pick the specific app. Only enabled and report-only policies are evaluated; Off policies are listed separately.
- Export MD β the scenario and both lists as Markdown.
Read-only. Like the Microsoft tool it does not follow Conditional Access service dependencies, so a policy on a downstream service isn't pulled in.
π Change audit NEW
Who changed which Conditional Access resource, when, and exactly what changed β read from the Entra directory audit log.
- Covers policies, named locations, authentication strengths and contexts, and terms of use β add, update and delete.
- Field-level diff β expand an entry and you get the fields that actually moved (
state: report-only β enabled, a group added toexcludeGroups), not a wall of JSON. Assignment lists are compared as sets, so you see the one group that changed rather than the whole array. - Who and from where β the user or application that made the change, with the source IP, plus the result if it failed.
- Filters β by resource kind, plus search across resource, person and changed field name; pick a 7, 30 or 90-day window.
- Export MD β the whole change set with per-entry diff tables, for a review or a ticket.
Read-only. Needs AuditLog.Read.All (requested when you run it) and a reader role such as Reports Reader, Security Reader or Security Administrator. Audit retention is licence-bound β roughly 30 days on Entra ID P1/P2, 7 days otherwise β so this is a rolling window, not full history.
πͺ Exclusion analyzer
Every exclusion across all policies in one place.
- Matrix (default) β exclusions Γ policies; Effective users β the same but expanded to the individual users a group exclusion covers; Risk review β policies scored for exclusion governance, worst first.
- Risk review flags β High a privileged role excluded, or all guests/external excluded; Medium direct user exclusions (no lifecycle), more than five excluded groups, or disabled accounts still in scope β directly or sitting inside an excluded group; Info a report-only policy whose exclusions go live the moment it is enforced. Each flag is a prompt to review, not a finding. Patterns follow Tiago S. Carvalho's CA exclusions audit.
- Type chips β All, User, Group, Directory role, Guest/external, Application, Named location, Device platform.
- Click to filter β click a user/group row to show only the policies excluding it, or a policy column to show only the exclusions in scope for it. The out-of-scope βΒ·β cells drop away; a banner shows the filter with a one-click clear.
- Export β CSV or Markdown; full-screen for wide grids.
Read-only.
𧬠Baseline Policies β Limon-IT R26.6
Matches this tenant against the Limon-IT baseline catalog and shows the gap.
- Status filters β Missing (not in tenant), Outdated (older version present), Up to date, Not in baseline (in tenant but not the catalog).
- Table / Cards β the large Limon-IT catalog opens as a Table by default; switch to Cards for full detail. Search and collapsible persona sections.
- Catalog switch β Limon-IT R26.6 or the community Joey Verlinden catalog.
- Export MD β a gap report; Refresh re-compares in place; Import baseline hands the missing/outdated set to the Import tool.
Read-only comparison. Only Import (below) writes.
π§© Baseline (Joey Verlinden)
The same comparison view against the community Conditional Access Baseline by Joey Verlinden β a different catalog, opens as Cards.
Read-only.
π MS Learn checks
Checks policies against documented Microsoft Learn exclusions and limitations β break-glass, token protection, Teams Rooms, retired features.
- Findings tab lists what conflicts with the docs; Refresh re-runs after you fix something.
- Buildable fixes β where a documented fix exists, apply it in the tenant (creating a service principal or group if the fix needs one). writes to tenant
Checks are read-only; applying a fix writes, and produces a change report.
π Backup (JSON)
Select policies (or take all) and download their raw JSON in a zip β dependencies (groups, named locations, auth strengths/contexts) and any Terms-of-use PDFs are included, so the backup is importable.
Read-only download.
π₯ Conditional Access groups writes to tenant
The group side of the baseline, in one tool.
- Check β baseline groups vs this tenant: present, missing, or drifted. Create a single missing group per row (the TeamsSharedDevices group is created as a dynamic group with the Teams-Rooms membership rule). If a group should be role-assignable but isnβt (immutable after creation), β» Recreate role-assignable renames the old one, creates a new one, re-points the referencing policies and writes a readme of where it was assigned.
- Members β a members Γ groups matrix.
- Assign β add a group to policiesβ include or exclude lists (ADD is additive β it never removes whatβs there). A final confirmation and a change report before anything is written.
Writes only on Create / Recreate / Assign, each behind a confirmation.
π Named locations BETA writes to tenant
Manage the named locations your Conditional Access policies target β the IP-range and country locations β without leaving the tool.
- Cards / Table β Cards tile at least two per row with the ranges, usage and the Edit/Delete buttons; Table is the same information one line per location, which is the readable option once a tenant has dozens.
- View β every location with its ranges or country list, whether it's trusted, and which policies use it (included or excluded). Filter by IP / country / trusted / unused, or search.
- οΌ New location β create an IP ranges location (CIDR, one per line, IPv4 or IPv6, optionally marked trusted) or a countries/regions location (two-letter ISO codes, optionally including unknown countries, with client-IP or Authenticator-GPS lookup).
- Edit β rename and change the ranges/countries. The type is fixed at creation: an IP location can't become a country location. If you change the trusted flag, you're warned how many policies use βAll trusted locationsβ and would follow the change.
- Delete β a location that no policy references deletes after a plain confirm; one that is still referenced lists those policies and needs a typed DELETE, because removing it drops that condition and usually widens the policy.
- Click a location name β opens its report: every range or country, the trusted flag and what it means, the location id, and the full list of policies that name it plus the ones covering it through βAll trusted locationsβ (each clickable through to the policy card). From there, π Documentation (MD) writes that one location up on its own.
- Export MD β the full inventory with usage, as Markdown.
- β³ Export JSON β the configuration of every location as a snapshot file. Nothing is stored server-side, so this is how you keep a record of what the ranges looked like on a given day.
- β Compareβ¦ β load an earlier JSON export and see what moved since: locations whose ranges, countries or trusted flag changed, ones in the file that are gone from the tenant, and ones created since. Matched by display name, because an id from another tenant means nothing here. A flipped trusted flag is the one worth looking at first β it silently changes which policies match.
Reading is read-only; create, edit and delete write to the tenant and ask for Policy.ReadWrite.ConditionalAccess when you run them.
π Set Policy state writes to tenant
Switch selected policies between On (enabled), Report-only (logged, not enforced) and Off (disabled).
Writes the new state to the tenant after you confirm.
π₯ Import writes to tenant
Restore a backup (zip or extracted folder). Dependencies are created first (create-if-missing), then the policies β always in state Off unless a replacement inherits an existing state.
- Assignment mode β π Deployment groups: new policies are scoped to this tenantβs deploy persona groups (
CAD-SEC-U-DG-*). Staged and safe β nothing already in the tenant is touched. - Assignment mode β β»οΈ Match & replace: for a policy whose CA number already exists at a different version, the new version keeps the current policyβs assignment and state, merges in any new exclusion groups the update adds (created if missing), and the old version is switched Off β a seamless swap.
- Import only β pick a persona to bring in just its policies, or use All / None. A policy with the same CA number and version is skipped.
- Unknown application references β a policy can only name an app that has a service principal in this tenant, and Graph rejects the whole policy over one it cannot resolve. The importer instantiates the missing ones first (the baseline excludes Microsoft first-party apps like Defender for Endpoint and Defender for Mobile TVM that an unused tenant does not have). If one still cannot be created, the policy is imported without that reference rather than failing β the report names each drop, and a dropped exclusion widens the policy, so review it before switching it On.
- π no Workload ID licence β a policy scoped to service principals (the CA900 range) needs the separately purchased Microsoft Entra Workload ID licence, which is not part of Entra ID P1/P2. The importer reads the tenantβs subscriptions first; without the licence those policies are shown greyed out and left out entirely, rather than attempted and rejected by Graph with a bare 400. Buy or trial the licence, then re-import.
- π needs ToU β a policy granting a Terms of use imports without that control (Terms of use has no create API); the report gives a checklist to create it in the portal, then re-import.
Writes; a change report is shown on screen and downloadable.
General
- Tabs β tools open in browser-style tabs; the + opens another, the house button returns to the tool grid, and β all closes every tab at once.
- Permissions β sign-in is read-only; a write tool requests its extra scope only when you run it, with an up-front consent step so pop-ups arenβt blocked.
- Demo β append
?demo=1to explore with sample policies; writes are simulated. - Build β the number on the sign-in screen matches the asset version; hard-refresh if it lags what you expect.