Griffin31
HEBook a demo
HE
Blog

Microsoft Graph API permissions, Entra roles and consent: what to know

26 August 2025

Admin consent on a delegated permission doesn’t mean the app can do everything in your tenant.

There’s one line we hear again and again: “If I grant an app delegated Graph permissions with admin consent, the app can do everything in the tenant.”

It’s especially confusing when you start working with Microsoft Graph and Entra ID. If an app gets a delegated scope like PrivilegedAccess.ReadWrite.AzureADGroup, can anyone in the tenant use it? The short answer: no.

The insight that changes everything: delegated permissions always run in the context of the signed-in user. The user’s existing Entra role remains a gatekeeper, just as much as the app’s permissions.

Delegated vs. application permissions: what’s the difference?

Delegated permissions (user + app). In this scenario:

A real test: we ran Graph CLI with PrivilegedAccess.ReadWrite.AzureADGroup. As a normal user, every call failed. As Global Admin, it all worked. Delegated permissions don’t elevate users; they only let the app do what the user could already do by hand.

Application permissions (app alone). No user is involved here: the app runs under its service principal identity. The action succeeds based solely on the permissions granted to the app, regardless of any user role.

Example: an app with Group.ReadWrite.All as an application permission can create or delete groups with no user signed in at all. That’s why application permissions must be treated like privileged service accounts: they bypass user checks entirely.

Entra directory roles: the overlooked link

It’s tempting to think API permissions alone decide what gets done, but that’s only half the story. In the delegated model, the user’s Entra role matters just as much.

Delegated Graph permissionRequired Entra roles
Group.ReadWrite.AllGlobal Admin, Groups Admin, Directory Writers
RoleManagement.ReadWrite.DirectoryGlobal Admin, Privileged Role Administrator
PrivilegedAccess.ReadWrite.AzureADGroupGlobal Admin, Privileged Role Administrator
Directory.ReadWrite.AllDepends on the object: e.g. User Administrator for users; all objects only Global Admin

Even with the app permission in place, you’re stuck if the user doesn’t hold one of these roles. Delegated only works when the app’s permission and the user’s role line up.

Consent models: user vs. admin

User consent:

Admin consent:

Security risks and misuse

These are the most common mistakes we see:

The danger isn’t in delegated permissions. It’s in misunderstanding how they work, or over-provisioning application permissions without oversight.

Best practices

Dynamic vs. static consent

According to Microsoft’s documentation, delegated permissions can be granted dynamically at runtime (incremental consent). An app can request additional scopes as needed, and the user decides in the moment.

Application permissions don’t have this flexibility: they’re static and must be pre-approved by admins. That’s another reason delegated permissions are often the better choice.

Conditional Access: another difference

Conditional Access policies apply to delegated permissions, because a user is signing in. If a policy requires MFA, device compliance or specific networks, it applies.

With application permissions there’s no user sign-in, so regular Conditional Access policies don’t apply. You can block service principals by location or risk with Conditional Access for workload identities, but only for single-tenant apps registered in your tenant, and only with a Workload Identities Premium license. SaaS apps and managed identities aren’t covered, an often-overlooked governance gap.

The bottom line

If you take one thing away: delegated permissions don’t elevate users; they respect their boundaries.

App permissions and consent settings are easy to lose track of. Griffin31 checks your tenant’s settings continuously and shows you what to fix first.

Sources