In Microsoft Entra ID, one click on a consent prompt can give an application standing access to a user's mailbox and files, and one admin consent can extend that access to every user in the tenant. Those grants survive password resets and MFA changes, they are held by a service principal that most identity teams never review, and attackers have learned to request them through consent phishing. This guide covers Entra ID applications and enterprise application security in depth: delegated and application permissions, Microsoft Graph permissions, user consent settings, app consent policies, the admin consent workflow, publisher verification, detection and how to revoke app consent after an illicit consent grant. It is for Entra ID administrators, Microsoft 365 security teams and SOC analysts. For the cross-platform view of SaaS integrations see the SaaS and OAuth App Governance Guide.
Key takeaways
- Every consent creates a non-human identity. A multitenant app gets a service principal in your tenant the moment someone consents, with the permissions that were granted.
- Application permissions are the dangerous ones. Microsoft calls them "highly privileged because they allow applications to access and modify resources without requiring a signed-in user."
- Default user consent is too open. By default "all users are allowed to consent to applications for permissions that don't require administrator consent." Restrict it to verified publishers and low-impact permissions, or turn it off.
- Give users a route to yes. The admin consent workflow sends requests to named reviewers, so restricting consent does not push people to workarounds.
- Password resets do not evict an app. Microsoft notes that resetting passwords or requiring MFA is not effective against an illicit consent grant; you must remove the grant and the service principal.
Entra ID applications, service principals and enterprise apps
Entra ID applications have two halves. The application object lives only in the app's home tenant and acts as "a template or blueprint." A service principal is "created in every tenant where the application is used," and it is the service principal that holds permissions, consent grants, credentials and sign-in history. The Enterprise applications page in the Entra admin center lists the service principals in your tenant; App registrations lists the application objects your tenant owns.
| Object or term | What it is | Governance question |
|---|---|---|
| App registration (application object) | Definition of an app built in your tenant | Who can register apps, who owns them, what credentials they have |
| Enterprise application (service principal) | Local instance of any app used in your tenant, yours or a third party's | What permissions it holds, who consented, is it still used |
| Single tenant app | One service principal, in its home tenant | Internal ownership and credential hygiene |
| Multi tenant app | Service principal created in each tenant where a user consents | Is the publisher verified, what data leaves the tenant |
| Managed identity | Service principal for an Azure resource, no application object | Covered in the Azure RBAC and Service Principals Guide |
- Third party and outbound app consent: when users consent to a multitenant application homed in another organisation's tenant, data flows outbound to a publisher you do not control. These are the grants that need the most scrutiny, and the ones attackers create.
- Microsoft first party apps: Microsoft's own services also appear as enterprise applications. Microsoft's illicit consent guidance and app governance in Defender for Cloud Apps both focus review on non-Microsoft apps; filter first party apps out of consent reviews but not out of sign-in and credential monitoring.
- Who can register apps: CISA's SCuBA baseline MS.AAD.5.1v1 says "Only administrators SHALL be allowed to register applications." User-registered apps become unowned service principals with their own secrets.
Delegated permissions, application permissions and Microsoft Graph
- Delegated permissions (scopes): the app acts on behalf of a signed-in user and "isn't able to access anything the signed in user couldn't access." The effective access is the intersection of the permission and the user's own rights.
- Application permissions (app roles): the app acts as itself with no user present and "is able to access any data that the permission is associated with."
Mail.Readas an application permission means every mailbox in the tenant. - Consent rules: "Application permissions and many high-privilege delegated permissions can only be consented to by an administrator." Microsoft Graph documentation adds that only Privileged Role Administrator and Global Administrator can consent to Graph application permissions.
Microsoft Graph permissions follow the pattern resource.operation.constraint. With no constraint the permission covers the signed-in user's own data; .All means every instance in the tenant, while .OwnedBy, .Shared and .Selected narrow it. Some Graph API permissions deserve a standing alert whenever they are granted:
| Permission | Type | Why it is high risk |
|---|---|---|
| Directory.AccessAsUser.All | Delegated | Microsoft calls it "the highest privileged delegated permission," with access to nearly all Entra ID operations as the user |
| Directory.ReadWrite.All | Delegated or application | Second in Microsoft's privilege ranking; broad directory write |
| RoleManagement.ReadWrite.Directory, AppRoleAssignment.ReadWrite.All, Application.ReadWrite.All | Application | Can assign directory roles, grant further Graph permissions or add credentials to other apps: each is a path to Global Administrator |
| User.ReadWrite.All | Application | Can update properties of users "assigned privileged admin roles" |
| Mail.Read, Mail.ReadWrite, Mail.Send, Files.ReadWrite.All, Sites.ReadWrite.All | Application | Tenant-wide data access or impersonation, typical exfiltration targets |
| offline_access with Mail or Files scopes | Delegated | Refresh tokens keep a consented app reading a user's data long after the session |
Where an app genuinely needs mailbox access, scope it. Exchange Online RBAC for Applications grants application permissions against a management scope or administrative unit, but Microsoft warns that combined with an unscoped Entra grant the result is "no effective resource scoping", so remove the tenant-wide Entra permission when you scope it in Exchange. For Teams and chats, resource-specific consent grants access to one team or chat instead of all of them.
User consent settings and app consent policies
User consent settings decide which consent prompts an ordinary user can approve. They are implemented as app consent policies (permission grant policies) assigned to the default user role. Changes only affect future consent: "Existing consent grants remain unchanged," so tightening the setting must be followed by a review of what was already granted.
| Setting | Policy | When to use |
|---|---|---|
| Do not allow user consent | No self-consent policy assigned | Regulated or high-risk tenants; every app goes through the admin consent workflow |
| Allow user consent for apps from verified publishers, for selected permissions | microsoft-user-default-low | Most organisations; users can approve low-impact permissions for verified or in-tenant apps |
| Microsoft managed recommendations | microsoft-user-default-recommended | Tenants that want Microsoft to update the conditions over time; review what it currently allows |
| Allow user consent for apps | microsoft-user-default-legacy | Not recommended: any app, any permission not requiring admin consent |
| Custom app consent policy | Include and exclude condition sets | Large tenants needing exceptions, assigned to users through custom roles |
- Permission classifications: the low option only works once you classify permissions as low impact. Start with sign-in and basic profile scopes such as
openid,profile,email,offline_accessandUser.Read, and decide deliberately whetheroffline_accessbelongs there. - Condition sets: a consent request passes a policy if it matches at least one include set and no exclude set. Conditions include permission type, permission classification, resource application and
ClientApplicationsFromVerifiedPublisherOnly. - Assignment-required apps: when an enterprise app requires user assignment, its permissions must be consented by an administrator even if user consent policy would allow it.
- Do not rely on policy lists alone: Microsoft warns not to treat principals with consent policies "as an exhaustive list of what can grant consent"; administrative roles can also grant.
SCuBA MS.AAD.5.2v1 requires that "User consent to applications SHALL be restricted." Small organisations can usually choose the verified publisher, low impact option and be done. Large tenants often disable user consent entirely, route everything through the workflow and use custom policies for a small set of pre-approved publishers.
Admin consent and the admin consent workflow
Admin consent grants permissions for the whole organisation, recorded as a delegated grant with consent type AllPrincipals or as app role assignments. Treat every admin consent request as an access request for a privileged non-human identity.
The admin consent workflow lets a user who cannot consent send an admin consent request to designated reviewers by email. Configure it under Enterprise apps, Consent and permissions, Admin consent settings by setting "Users can request admin consent to apps they are unable to consent to" to Yes, then choose reviewers, notifications, reminders and an expiry in days. Two details matter:
- Reviewers are not approvers by default: designating a reviewer "doesn't elevate their privileges"; they can only approve permissions they could grant anyway.
- Graph application permissions need Global Administrator: "only Global Administrators can approve admin consent requests for apps requesting for Microsoft Graph app roles (application permissions)."
For each request, reviewers should check: the publisher and whether it is verified, the exact delegated and application permissions, whether offline access is requested, the reply URLs, the business owner and purpose, and whether a narrower permission or scoped Exchange RBAC would work. SCuBA MS.AAD.5.3v1 requires that "An admin consent workflow SHALL be configured for applications."
Publisher verification and unverified apps
Publisher verification means the publisher has linked a verified Microsoft AI Cloud Partner Program account to the app, and a blue verified badge appears on the consent prompt. Microsoft is explicit about its limits: the badge "doesn't imply or indicate quality criteria," and verified status "is only one of the several criteria to consider." With risk-based step-up consent, users cannot consent to most multitenant apps registered after 8 November 2020 from unverified publishers that request more than basic sign-in. Unverified apps are not automatically malicious, but they should require admin review.
Verification can also be abused. In the Microsoft Verified Publisher OAuth phishing campaign, fraudulent partner accounts gave malicious apps a verified badge and then mailbox access. Restricting consent to verified publishers raises the bar; it does not replace review of high-risk permissions.
Consent phishing, illicit consent grants and enterprise application backdooring
Microsoft defines an illicit consent grant as an attacker registering an application that "requests access to data such as contact information, email, or documents" and tricking a user into consenting, after which the app has access "without the need for an organizational account." ATT&CK records the lure under T1566.002 Spearphishing Link ("a malicious OAuth 2.0 request URL") and the outcome under T1528 Steal Application Access Token. OAuth app consent phishing needs no password theft, so phishing-resistant MFA does not stop it; consent policy does.
- User-targeted: a convincing app name and logo, delegated Mail, Files and offline access scopes, sent to many users at once.
- Admin-targeted: a request for application permissions or tenant-wide consent sent to an administrator, often framed as a vendor integration.
- Enterprise application backdooring: instead of a new app, an attacker with Application Administrator rights or
Application.ReadWrite.Alladds a new secret or certificate to an existing, already-trusted service principal and inherits its permissions. ATT&CK tracks this as T1098.001 Additional Cloud Credentials. The Malwarebytes breach showed an attacker abusing an existing Azure AD application identity to read internal email. - Dormant privileged apps: the Microsoft Midnight Blizzard breach began with a legacy test OAuth application that still held elevated access, which the attacker used to grant further apps access to corporate mailboxes.
Implementing consent governance
- Inventory first. Export all service principals with their delegated grants (oauth2PermissionGrants), application permissions (appRoleAssignments), owners, credentials, publisher and last sign-in. Flag every non-Microsoft app with application permissions or AllPrincipals grants.
- Enable the admin consent workflow with reviewers and a service level, before restricting anything. It can take up to an hour to become active.
- Classify permissions and switch user consent to verified publishers and low impact permissions, or to no user consent. Pilot by announcing the change and watching admin consent requests for two weeks.
- Restrict app registration to administrators and assign owners to every app registration.
- Remediate the backlog. For each high-risk grant, confirm the owner and need, narrow the permission or scope it, and remove dormant or unowned apps. Disable before deleting so you can roll back quickly.
- Harden credentials. Block new client secrets where possible (SCuBA MS.AAD.5.5v1), limit secret lifetime to 180 days and certificate lifetime to 365 days, and prefer managed identities.
- Roll back a too-strict consent setting by re-assigning the previous policy; existing grants were never touched, so the impact is limited to new consents.
Detection, app governance and metrics
| Event or signal | Source | What to look for |
|---|---|---|
| Consent to application | Entra audit log, Microsoft Purview Audit | IsAdminConsent True when unexpected; consent by high-value users; bland or misspelled app names |
| Add delegated permission grant | Entra audit log | Grants with ConsentType AllPrincipals; Mail, Files or Directory scopes |
| Add app role assignment to service principal | Entra audit log | Any high-risk Graph application permission |
| Add service principal credentials; Update application (certificates and secrets) | Entra audit log | New secrets or certificates on existing apps, especially by unusual actors (T1098.001) |
| Service principal sign-ins | Entra sign-in logs | Sign-ins from new IP ranges or after long dormancy |
| App Governance alerts | Microsoft Defender XDR | Risky OAuth apps, anomalous app activity, policy violations |
Defender app governance in Defender for Cloud Apps covers OAuth-enabled apps registered in Entra ID, Google and Salesforce, shows "which user-installed OAuth applications have access to data" and what permissions they hold, and raises alerts with detection source App Governance. Without it, scheduled exports of grants plus SIEM rules on the audit events above give similar coverage. Microsoft suggests reviewing consent grants weekly in large organisations; audit events can take 30 minutes to 24 hours to appear.
- Exposure: non-Microsoft apps holding high-risk application permissions; trend down.
- Ownership: percentage of service principals with a named owner; target 100.
- Dormancy: apps with permissions and no sign-in in 90 days; remove them.
- Workflow health: median days to decide an admin consent request; keep it short so users do not seek workarounds.
- Unverified access: grants to unverified multitenant apps; target zero outside approved exceptions.
Consent phishing response: revoke app consent
- Contain the app. Disable sign-in for the service principal (set "Enabled for users to sign-in?" to No) so its tokens cannot be renewed, before you delete anything.
- Revoke grants. Revoke admin-consented permissions from the Permissions page; user consent grants can only be removed through Graph or PowerShell (
Remove-MgOauth2PermissionGrant,Remove-MgServicePrincipalAppRoleAssignment). - Revoke user sessions for consenting users so existing refresh tokens are invalidated, and check their mailboxes for new inbox rules or forwarding.
- Scope the impact from audit logs: which users consented, the period of access, and data the app read. Mailbox auditing must have been on beforehand.
- Prevent re-consent. Microsoft notes that revoking a grant "doesn't stop users from re-consenting"; tighten user consent settings or delete the service principal and block the app.
- Hunt for siblings. Search for other apps from the same publisher, reply URL or creation window, and for credentials added to existing apps.
For the wider playbook see the Phishing Incident Response Playbook.
Common failure patterns
- Default consent never changed: users approved hundreds of apps over years, and tightening the setting later left every old grant in place.
- Admin consent as a rubber stamp: administrators approve tenant-wide consent to make a prompt go away, without reading the permissions.
- Verified badge treated as safe: verification proves who the publisher is, not that its app or infrastructure is secure.
- Only new apps monitored: alerts fire on new consents but not on credentials added to old, trusted service principals.
- Password reset as remediation: responders reset the user's password and close the case while the malicious app keeps reading mail.
- Unscoped mailbox permissions: integrations hold
Mail.Readas an application permission for every mailbox when they need a dozen.
Framework mapping
| Framework | Reference | Control |
|---|---|---|
| MITRE ATT&CK | T1566.002, T1528, T1098.001 | Restrict consent (M1021), audit apps (M1047), user training (M1017); monitor credential additions |
| CISA SCuBA Entra ID baseline | MS.AAD.5.1v1 to 5.3v1, 5.5v1 to 5.7v1 | Admin-only registration, restricted user consent, admin consent workflow, credential limits |
| NIST SP 800-53 Rev. 5 | AC-6, AC-2, CM-11, AU-6 | Least privilege for apps, account management, user-installed software, audit review |
| CIS Controls v8.1 | 2.5, 6.8 | Allowlist authorised software, role-based access control |
| ISO/IEC 27001:2022 Annex A | A.5.18, A.5.19, A.8.2 | Access rights, supplier relationships, privileged access rights |
Practitioner checklist
- Restrict user consent to verified publishers and low impact permissions, or disable it.
- Enable the admin consent workflow with named reviewers and a response target.
- Allow only administrators to register applications and assign an owner to every app.
- Inventory all enterprise apps and review high-risk Graph application permissions and AllPrincipals grants.
- Scope mailbox access with Exchange RBAC for Applications and remove unscoped Entra grants.
- Alert on consent events, new app role assignments and credentials added to existing service principals.
- Remove dormant and unowned apps after a disable period.
- Keep a consent phishing runbook that revokes grants, sessions and blocks re-consent.
Standards and references
- Microsoft Learn: Overview of permissions and consent in the Microsoft identity platform
- Microsoft Learn: Configure how users consent to applications
- Microsoft Learn: Manage app consent policies
- Microsoft Learn: Configure the admin consent workflow
- Microsoft Learn: Detect and remediate illicit consent grants
- Microsoft Learn: Overview of Microsoft Graph permissions
- MITRE ATT&CK: T1528 Steal Application Access Token
- CISA: SCuBA Microsoft Entra ID Secure Configuration Baseline
Related NHI Mgmt Group resources: SaaS and OAuth App Governance Guide · OAuth 2.0 and OpenID Connect Guide · Microsoft 365 Security Guide · Active Directory and Entra ID Hardening Guide