Microsoft 365 OAuth App Risk Review and Consent Cleanup
Every application that has ever been granted OAuth access to your Microsoft 365 tenant still has it. A consent one user clicked through two years ago survives the password reset, the multifactor rollout and even that user leaving — Microsoft's own remediation guidance says so plainly: resetting passwords and requiring multifactor authentication are not effective against an illicit consent grant, because the application is external to your organization and never needs the password. IT Partner clears the whole estate in one fixed-price week on a single tenant: we export every enterprise application, app registration, delegated and application permission grant — scope, consent type, the user who granted it — with publisher-verification status, owners, credentials and expiry dates and last sign-in activity; we sort it into a risk-tiered register (tenant-wide mail, files and directory permissions, offline_access refresh tokens, unverified publishers, abandoned apps, ageing secrets, apps consented by people who have left); we revoke and remove in agreed waves, nothing without a named owner's confirmation and every batch recorded with its restore path; we harden user-consent settings to Microsoft's recommended posture, configure the admin consent workflow with named reviewers, expiry and notifications, switch on app governance policies where Defender for Cloud Apps is licensed, and hand over a one-page approval procedure for the next app request. $1,950 per project, fixed, for one tenant with up to 300 non-Microsoft applications; larger estates are quoted per tenant. It does not need Microsoft 365 E5 — everything except the app governance layer is native to Microsoft Entra ID, and any licence the app governance layer needs is billed by Microsoft or your CSP, not by us.
What this engagement is
An OAuth grant is a standing key, not a session. When a user accepts a consent prompt, Microsoft Entra ID writes a permission grant against a service principal in your tenant, and the application keeps coming back with a refresh token long after the browser is closed. That is why consent abuse has become the technique of choice against Microsoft 365, and why the usual reflexes miss it: Microsoft's guidance on illicit consent grants states that normal remediation steps such as resetting passwords or requiring multifactor authentication aren't effective, because these apps are external to the organization. Microsoft Threat Intelligence published a campaign analysis on 2 March 2026 in which attackers registered applications in tenants they controlled, pointed a redirect URI at a rogue domain and sent OAuth links carrying deliberately invalid scopes so that Entra ID's own error handling bounced the victim — largely government and public-sector staff — onto an attacker page that delivered malware. The first mitigation Microsoft lists in that write-up is exactly the scope of this engagement: limit user consent, review application permissions regularly, and remove unused or over-privileged apps. Separately, the FBI's Internet Crime Complaint Center published a public service announcement in May 2026 about a phishing-as-a-service kit that abuses the OAuth device code flow — the victim completes a genuine Microsoft sign-in, multifactor challenge included, and the criminal's application walks away with the tokens. The work starts with an export most tenants have never seen in one place. Every service principal that appears under Enterprise applications — gallery apps, an app somebody signed into once, apps that arrived with a Microsoft service, your own developers' app registrations, managed identities — and for each of them the delegated permission grants and their scopes, the consent type (a grant made for one person, or `AllPrincipals`, Microsoft's marker for a grant that covers everyone in the tenant), the user who granted it, the application permissions that run with no signed-in user at all, publisher-verification status, owners, client secrets and certificates with their expiry dates, and last sign-in activity from the service principal sign-in logs. We use Microsoft's own method for it — the permissions inventory script Microsoft references from its illicit-consent-grant playbook, plus Microsoft Graph queries — so every line of the register is something you can reproduce yourself after we leave. Two limits go into the report at the front rather than the footnotes: Microsoft Entra keeps sign-in and audit logs for seven days on a free licence and 30 days with Entra ID P1 or P2, so 'last used' beyond that window comes from Entra's own recommendations engine, which computes unused applications on a 90-day basis and unused credentials on a 30-day basis; and an audit record for a consent event can take from 30 minutes up to 24 hours to appear, so a very recent grant is caught by the export rather than by the log. The register then sorts the estate into tiers you can act on. The top tier is application permissions with tenant-wide reach — read or read-write across all mailboxes, all sites and files, or the directory itself — held by anything that is not a Microsoft first-party service, because those run without a user and are invisible to every control that depends on one. Next are tenant-wide delegated grants to non-Microsoft applications and any grant carrying offline_access, the permission that keeps an app coming back when nobody is using it. Then the hygiene tier: apps from publishers Microsoft has not verified, apps consented by a single user who has since left, apps with no owner in your organization, apps with no sign-in activity in 90 days, and credentials that are unused, ageing or already expired. Removal happens in waves, and this is the part that decides whether the week is a success or an outage: business-critical integrations are identified before the first wave, nothing is revoked without a named owner confirming, batches run with a hold between them so a dependency surfaces while we are still on the call, and each batch is recorded with the exact grant identifiers. Microsoft supports restoring a revoked permission through Graph or PowerShell — not through the portal — and the restore commands ship with the register. Cleaning up without changing the setting that allowed it just resets the clock, so the second half of the week is configuration. User consent moves to the posture you choose: Microsoft's recommended middle option allows users to consent only to applications from verified publishers and only to permissions you have classified as low impact (the basic sign-in set is openid, profile, email and — with eyes open, because it is what keeps an app alive in the background — offline_access), with admin-only consent as the stricter setting and a custom app consent policy where neither built-in option fits. We confirm risk-based step-up consent is on, and we enable the admin consent workflow so a blocked request becomes a review rather than a support ticket: named reviewers, email notification, expiry reminders and a request expiry you set. Where Defender for Cloud Apps is licensed we turn on app governance and build the hygiene policies with it; where it is not, the same questions are answered from Entra's application recommendations and our register, and we tell you which of the two you are getting before the quote. You keep the register, the decision log, the evidence of every setting change and a one-page procedure for the next application request. Deploying Defender for Cloud Apps and running app governance as an operation is Microsoft Defender for Cloud Apps Implementation; the recurring watch on new consents and expiring credentials is Managed Entra ID Identity Hygiene and Access Reviews; and if you already know an account was taken over, start with Business Email Compromise Investigation and Recovery — this is a hygiene project, not an incident response.
Success criteria
What you receive
How the work unfolds
We take the time-bound delegated access you approve, then export the full estate: service principals, app registrations, delegated permission grants with scopes and consent type, application role assignments, publisher-verification status, owners, credentials with expiry dates and service principal sign-in activity. You get the raw export the same day, along with the queries that produced it, and we tell you straight away how many non-Microsoft applications the tenant actually holds against the 300 the fixed fee covers.
The export becomes the risk-tiered register, and we search the Microsoft Purview audit log for the retained period for 'Consent to application' events — who consented, to what, whether it was an administrator acting for the whole organization. Anything that looks like an active problem rather than old clutter is flagged to you that day, with the recommendation to move to incident response instead of continuing as a clean-up if the evidence points that way.
A working session with your IT lead and whoever owns the business relationships. We go through the register tier by tier and agree keep, reduce or revoke for each item, identify the named owner behind every application that stays, and set the wave plan for removals — what goes first, what needs a warning to its users, what waits for a change window. Decisions are written up the same day and approved by you before anything is touched.
Removals run in the agreed batches with a hold between them, each batch recorded with its identifiers and restore commands so a surprise dependency is a five-minute fix rather than a ticket. Then the settings: user consent moved to the approved posture, permission classifications set, a custom app consent policy where the built-ins do not fit, and risk-based step-up consent confirmed. Every change is captured before and after.
The admin consent workflow goes in with your named reviewers, notifications, reminders and expiry, and we run a test request through it end to end. Where Defender for Cloud Apps is licensed, app governance is switched on and the hygiene policies are built; where it is not, Entra's application recommendations are triaged into the same register. The readout covers what was found, what was removed, what remains and why, and the approval procedure is walked through with the reviewers. Our delegated access is removed and you confirm the removal.
Prerequisites
Who does what
IT Partner
- Produce the OAuth access register and the risk-tiered findings from the tenant's own data, with the queries you can rerun yourself
- Run the decision workshop, record the keep, reduce or revoke decision for every flagged application, and get your written approval before any change
- Execute the revocation waves in agreed batches, record each batch with its identifiers and restore commands, and stop the moment something unexpected breaks
- Configure user consent settings, permission classifications, any custom app consent policy, the admin consent workflow and — where licensed — app governance policies, with before-and-after evidence for each
- Deliver the readout and the one-page approval procedure, walk your reviewers and service desk through them, and remove our own access at the end
Your team
- Approve the time-bound delegated access and make the Global Administrator available for the workflow step
- Name the business owners, confirm which applications the business depends on, and approve the revocation waves before they run
- Decide the consent posture — administrators only, or verified publishers with low-impact permissions — and accept the permission classification that goes with it
- Buy or assign any Microsoft licence the app governance layer needs, and pay Microsoft or your CSP for it
- Own the approval procedure after handover: keep the reviewer list current, and decide whether the recurring review is done in-house or handed to a managed service
What's not included
Limitations & technical notes
Frequently asked questions
What does the Microsoft 365 OAuth App Risk Review and Consent Cleanup actually do?
In one week on one tenant it answers the question 'which applications can read our data, who let them in, and do we still want that?' — and then acts on the answer. We export every enterprise application, app registration and permission grant with its scopes, consent type, granting user, publisher status, owner, credentials and last use; build a risk-tiered register; agree keep, reduce or revoke for each item with you; run the removals in recorded waves with restore commands; harden the user consent settings so it cannot silently refill; configure the admin consent workflow with named reviewers; switch on app governance where you are licensed for it; and hand over a one-page approval procedure and a readout.
What is an illicit consent grant, and why doesn't multifactor authentication stop it?
An attacker registers an application, tricks a user into consenting to it — through a phishing message or a compromised page — and from then on the application reads that user's mail, files or contacts directly through Microsoft Graph. It never uses the password, so the account can have multifactor authentication, a strong password and a compliant device, and the access continues. Microsoft's own guidance says normal remediation such as resetting passwords or requiring multifactor authentication is not effective here, because the application is external to your organization. The only thing that removes the access is removing the grant — which is what this engagement does, at estate scale.
Do we need Microsoft 365 E5 or Defender for Cloud Apps for this?
No. The discovery, the register, the revocation, the user consent settings, the permission classifications, the custom app consent policy and the admin consent workflow are all native to Microsoft Entra ID and work on Business Premium, E3 or E5. Defender for Cloud Apps only matters for the app governance layer — the automated unused-app, unused-credential and expiring-credential policies. Where you are licensed for it, we turn it on and build those policies inside the same fixed fee; where you are not, the same findings come from Entra's own application recommendations and our register, and we say which of the two you are getting before you sign anything.
Will revoking consent break our line-of-business applications?
That is the risk the method is built around. Nothing is revoked without a named owner confirming it first; the register identifies business-critical integrations before the first wave; removals run in batches with a hold between them so a dependency surfaces while we are still on the call; and every batch is recorded with the exact grant identifiers and the Microsoft Graph or PowerShell commands that put it back. Microsoft supports restoring a revoked permission, so the honest expectation to set is not 'nothing will break' but 'if something breaks, it is back within minutes and we know exactly what it was'.
How do you decide what counts as risky?
By reach first, then by provenance, then by age. Application permissions held by non-Microsoft applications come first, because they run with no signed-in user — a grant to read all mailboxes or write to all sites does not care whose account is compromised. Then tenant-wide delegated grants, which Microsoft records with the consent type AllPrincipals, meaning everyone in the tenant is covered by one person's click. Then anything carrying offline_access, which is what keeps an application coming back when nobody is using it. Then publishers Microsoft has not verified, applications consented by users who have left, applications with no owner, applications with no sign-in in 90 days, and credentials that are unused, ageing or expired. Every line in the register says which rule put it there.
What settings do you change, and will our users notice?
The main one is user consent. Microsoft's default is that any user may consent to any permission that does not require administrator approval; the recommended middle setting allows consent only to applications from verified publishers and only to permissions you have classified as low impact; the strictest setting is administrators only. Users notice when they hit an application that no longer qualifies — which is exactly why the admin consent workflow goes in at the same time, so the user sends a request to a named reviewer instead of hitting a wall. We agree the posture with you in the workshop, and the basic sign-in permissions stay classified as low impact so ordinary sign-in flows are unaffected.
What is the admin consent workflow, and who should be a reviewer?
It is the Entra feature that turns 'this app needs admin approval' into a request routed to people you name, with email notification, reminders and an expiry you set. Reviewers should be the people who actually understand the business case — usually IT plus an application or data owner — but be clear on the limits: being a reviewer confers no privilege, so a reviewer can view, block or deny, while approving a request for Microsoft Graph application permissions still needs a Global Administrator. We configure it, put your reviewers in, and run one test request through it end to end so nobody meets the interface for the first time on a real request.
How many applications does the fixed fee cover?
One Microsoft Entra tenant with up to 300 non-Microsoft applications, counted at discovery, each service principal counted once however many grants it holds. Microsoft's own first-party service principals are inventoried for context but not counted against that number — a typical tenant has a lot of them, and charging for Microsoft's own apps would be nonsense. If the export comes back above 300, or if there are several tenants, we quote per tenant, and you hear the number on day one rather than in the invoice.
We think we have already been phished. Is this the right service?
Probably not first. If you have evidence of an account takeover — inbox rules you did not create, mail leaving the tenant, a sign-in from somewhere impossible — that is an incident, and Business Email Compromise Investigation and Recovery is the engagement that scopes and contains it. This service is the hygiene pass that removes the standing access an attacker would use, and the one you run afterwards so the same door is not open again. If the register turns up something that looks live while we are working, we stop and tell you the same day rather than quietly continuing as a clean-up.
Could we do this ourselves?
Yes, and we deliberately leave you able to. Microsoft publishes the method — the permissions inventory script referenced from its illicit-consent-grant playbook, the audit search for consent events, the revocation cmdlets — and everything in the register can be reproduced with the queries we hand over. What you are buying is a week of somebody who has done it before: the risk tiering that turns a 4,000-row CSV into about 40 decisions, the wave discipline that stops a clean-up becoming an outage, the settings posture agreed rather than guessed, and a written procedure at the end. Teams that try it in-house usually get the export and stall at the decisions.
Does this protect us against device code phishing?
It removes the standing app access that this class of attack leaves behind, and it makes the next grant harder to obtain — but blocking the flow itself is a Conditional Access change. Microsoft's guidance is to get as close as possible to a unilateral block on the device code flow, allowing it only for documented cases like legacy tooling, and to deploy that policy in report-only first with emergency access accounts excluded. Where you already run Conditional Access we build that policy and hand it to you in report-only for your own review; rolling out and operating a Conditional Access baseline is a separate engagement.
What access do you need, and how do we know it is gone afterwards?
Granular, time-bound delegated access that you approve — our published policy is GDAP rather than standing Global Administrator. Practically that means Cloud Application Administrator or Application Administrator for the review and revocation work, Privileged Role Administrator for the consent policy changes, and a Global Administrator of yours available for the steps Microsoft reserves to that role, such as turning on the admin consent workflow and running the tenant-wide permissions inventory. The last item in the handover is removing our access and showing you the audit log entry that proves it.
Who keeps this clean after you leave?
You do, with the procedure — and the honest warning that an estate refills. Microsoft's own advice for organizations with many registered applications and a large user base is to review consent grants weekly. If nobody on your team has time for that, Managed Entra ID Identity Hygiene and Access Reviews takes over the recurring watch on new consents, new registrations, expiring credentials and access reviews for a monthly per-user fee, and it starts exactly where this project ends. Where Defender for Cloud Apps is licensed, the app governance policies we build keep working on their own and raise alerts into your Defender incident queue.
How does pricing work?
$1,950 per project, fixed, quoted in writing before work begins, and you pay after you approve delivery. It covers one Microsoft Entra tenant with up to 300 non-Microsoft applications: the full export and register, the consent-event review, the decision workshop, the revocation waves with restore paths, the consent settings and permission classifications, any custom app consent policy, the admin consent workflow with a test request, app governance enablement and hygiene policies where you are licensed for it, the optional report-only device code flow policy where Conditional Access is already in use, the approval procedure and the readout. Larger estates and additional tenants are quoted per tenant. Microsoft's licences — Defender for Cloud Apps, the E5 bundles, Microsoft Entra Workload ID Premium — are billed by Microsoft or your CSP and are never part of this fee.