Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Create and configure Microsoft Entra (Azure AD) app registrations, scopes, and service principals
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
references/api-permissions.md
1# API Permissions Guide23This document explains how to configure and manage API permissions for your Microsoft Entra app registration.45## Permission Types67### Delegated Permissions (User Context)89**What:** Application acts on behalf of a signed-in user1011**When to use:**12- User is present and can consent13- App needs to access resources as the user14- Interactive authentication flows1516**Examples:**17- Read user's email18- Update user's calendar19- Access user's OneDrive files2021**Scope format:** User must consent (or admin pre-consents)2223### Application Permissions (App Context)2425**What:** Application acts with its own identity (no user)2627**When to use:**28- Background services, daemons29- Scheduled jobs30- API-to-API calls without user3132**Examples:**33- Read all users in organization34- Send mail as any user35- Access all SharePoint sites3637**Requirement:** Always requires admin consent3839## Permission Scopes4041### Understanding Scopes4243**Scope:** A string that defines what access is granted4445**Format:**46```47{resource}/{permission_name}4849Examples:50https://graph.microsoft.com/User.Read51https://graph.microsoft.com/Mail.Send52api://myapi-id/access_as_user53```5455### .default Scope5657Special scope that includes all configured permissions:5859```60https://graph.microsoft.com/.default61api://your-api-id/.default62```6364**When to use:**65- Client credentials flow (always)66- Want all pre-configured permissions67- Migrating from v1.0 endpoint6869## Microsoft Graph Permissions7071### Common Delegated Permissions7273| Permission | What it allows | Admin Consent Required |74|------------|---------------|----------------------|75| `User.Read` | Read signed-in user's profile | No |76| `User.ReadWrite` | Read and update user profile | No |77| `User.ReadBasic.All` | Read basic info of all users | No |78| `User.Read.All` | Read all users' full profiles | Yes |79| `Mail.Read` | Read user's mail | No |80| `Mail.ReadWrite` | Read and write user's mail | No |81| `Mail.Send` | Send mail as user | No |82| `Calendars.Read` | Read user's calendars | No |83| `Calendars.ReadWrite` | Read and write calendars | No |84| `Files.Read.All` | Read all files user can access | No |85| `Sites.Read.All` | Read items in all site collections | Yes |86| `Directory.Read.All` | Read directory data | Yes |87| `Directory.ReadWrite.All` | Read and write directory data | Yes |8889### Common Application Permissions9091| Permission | What it allows | Admin Consent Required |92|------------|---------------|----------------------|93| `User.Read.All` | Read all users' full profiles | Yes (Always) |94| `User.ReadWrite.All` | Read and write all users' profiles | Yes (Always) |95| `Mail.Read` | Read mail in all mailboxes | Yes (Always) |96| `Mail.Send` | Send mail as any user | Yes (Always) |97| `Calendars.Read` | Read calendars in all mailboxes | Yes (Always) |98| `Directory.Read.All` | Read directory data | Yes (Always) |99| `Directory.ReadWrite.All` | Read and write directory data | Yes (Always) |100| `Group.ReadWrite.All` | Read and write all groups | Yes (Always) |101102## Adding Permissions103104### Azure Portal Method1051061. Navigate to your app registration1072. Click **"API permissions"** in left menu1083. Click **"+ Add a permission"**1094. Choose API source:110- **Microsoft APIs** (Graph, Office 365, etc.)111- **APIs my organization uses** (custom APIs)112- **My APIs** (your own APIs)1131145. Select permission type:115- **Delegated permissions** (user context)116- **Application permissions** (app context)1171186. Search and select permissions1197. Click **"Add permissions"**120121See [cli-commands.md](cli-commands.md) for az cli commands to add API permissions programmatically.122123## Finding Permission IDs124125### Method 1: Azure Portal1261271. Go to Microsoft Entra ID → Enterprise applications1282. Search for "Microsoft Graph"1293. Click on it → Permissions1304. Browse available permissions and copy IDs131132### Method 2: Microsoft Graph Explorer1331341. Visit https://developer.microsoft.com/graph/graph-explorer1352. Click "Modify permissions"1363. Browse and view permission details137138### Method 3: Microsoft Documentation139140Visit: https://learn.microsoft.com/en-us/graph/permissions-reference141142### Method 4: Azure CLI Query143144```bash145# List all Graph permissions (warning: long output)146az ad sp list --filter "appId eq '00000003-0000-0000-c000-000000000000'" \147--query "[0].{delegated:oauth2PermissionScopes,application:appRoles}" -o json148```149150## Granting Admin Consent151152### When Admin Consent is Required153154**Always required for:**155- All application permissions156- High-privilege delegated permissions157- When organization disables user consent158159**Examples requiring admin consent:**160- `User.Read.All` (read all users)161- `Directory.Read.All` (read directory)162- `Mail.Read` (application permission)163- `Sites.Read.All` (read all SharePoint sites)164165### How to Grant Admin Consent166167**Portal Method:**1681. Go to API permissions1692. Click **"Grant admin consent for [Your Org]"**1703. Confirm the action1714. Check for green checkmarks next to permissions172173**CLI Method:**174```bash175az ad app permission admin-consent --id $APP_ID176```177178### Verifying Consent Status179180**Portal:** Look for green checkmarks in "Status" column181182**CLI:**183```bash184az ad app permission list --id $APP_ID185```186187Look for `consentType: "AllPrincipals"` (admin consented)188189## Custom API Permissions190191### Exposing Your API192193If you're building an API that other apps will call:1941951. In your API's app registration, go to **"Expose an API"**1962. Set **Application ID URI**: `api://your-api-id`1973. Click **"+ Add a scope"**1984. Configure scope:199- **Scope name:** `access_as_user`200- **Who can consent:** Admins and users201- **Display name:** "Access MyAPI as user"202- **Description:** Clear description of what this allows2035. Click **"Add scope"**204205## Effective Permissions206207### User + App Permissions208209**Delegated permissions:** Intersection of user's permissions and app's permissions210211Example:212- User can: Read all users213- App granted: User.Read.All214- **Effective:** Read all users ✅215216- User can: Only read their own profile217- App granted: User.Read.All218- **Effective:** Only read own profile (limited by user's rights)219220**Application permissions:** Only app's permissions matter (no user context)221222## Troubleshooting Permissions223224### "Insufficient privileges" Error225226**Causes:**227- Permission not added to app registration228- Admin consent not granted229- User lacks permission in directory230- Accessing resource outside permission scope231232**Solutions:**2331. Check API permissions in portal2342. Grant admin consent if needed2353. Verify user has access to resource2364. Use correct permission scope237238### "Consent required" Error239240**Causes:**241- User hasn't consented to permissions242- Admin consent required but not granted243- Token obtained before permission added244245**Solutions:**2461. Request user consent (interactive flow)2472. Admin grants consent (portal or CLI)2483. Acquire new token after adding permissions249250### Permission Appears Granted but Doesn't Work251252**Possible issues:**253- Using old cached token (get new one)254- Permission is delegated but user lacks rights255- API requires additional configuration256- Permission deprecated (use new one)257258**Debug steps:**2591. Decode access token: https://jwt.ms2602. Check `scp` claim (delegated) or `roles` claim (application)2613. Verify permission is present in token2624. Check if permission is correct type (delegated vs application)263264## Permission Best Practices265266### Development267268✅ **Do:**269- Start with minimal permissions270- Add incrementally as features require271- Test with non-admin accounts272- Document why each permission is needed273274❌ **Don't:**275- Request all permissions "just in case"276- Use admin account for testing only277- Forget to grant admin consent for app permissions278279### Production280281✅ **Do:**282- Review permissions quarterly283- Remove unused permissions284- Use least privilege principle285- Monitor permission usage286- Document all permissions in README287288❌ **Don't:**289- Grant excessive permissions for convenience290- Use application permissions when delegated would work291- Forget to rotate admin consent approvals292293### Security294295✅ **Do:**296- Prefer delegated over application permissions297- Implement proper scope validation298- Log permission usage299- Handle consent errors gracefully300301❌ **Don't:**302- Hardcode permission scopes in multiple places303- Skip token validation304- Ignore scope mismatches305- Cache permissions indefinitely306307## Reference Tables308309### Microsoft Graph Permission IDs310311**Delegated Permissions:**312```313User.Read : e1fe6dd8-ba31-4d61-89e7-88639da4683d314User.ReadWrite : b4e74841-8e56-480b-be8b-910348b18b4c315User.ReadBasic.All : b340eb25-3456-403f-be2f-af7a0d370277316Mail.Read : 570282fd-fa5c-430d-a7fd-fc8dc98a9dca317Mail.ReadWrite : 024d486e-b451-40bb-833d-3e66d98c5c73318Mail.Send : e383f46e-2787-4529-855e-0e479a3ffac0319Calendars.Read : 465a38f9-76ea-45b9-9f34-9e8b0d4b0b42320Calendars.ReadWrite : 1ec239c2-d7c9-4623-a91a-a9775856bb36321Files.Read.All : df85f4d6-205c-4ac5-a5ea-6bf408dba283322```323324**Application Permissions:**325```326User.Read.All : df021288-bdef-4463-88db-98f22de89214327User.ReadWrite.All : 741f803b-c850-494e-b5df-cde7c675a1ca328Mail.Read : 810c84a8-4a9e-49e6-bf7d-12d183f40d01329Mail.Send : b633e1c5-b582-4048-a93e-9f11b44c7e96330Directory.Read.All : 7ab1d382-f21e-4acd-a863-ba3e13f7da61331Directory.ReadWrite.All : 19dbc75e-c2e2-444c-a770-ec69d8559fc7332```333334**Note:** Permission IDs may change. Always verify against the official [Microsoft Graph Permissions Reference](https://learn.microsoft.com/en-us/graph/permissions-reference) for the most current values.335336## Additional Resources337338- [Microsoft Graph Permissions Reference](https://learn.microsoft.com/en-us/graph/permissions-reference)339- [Permission Types](https://learn.microsoft.com/en-us/entra/identity-platform/permissions-consent-overview)340- [Admin Consent Workflow](https://learn.microsoft.com/en-us/entra/identity/enterprise-apps/configure-admin-consent-workflow)341- [Consent Framework](https://learn.microsoft.com/en-us/entra/identity-platform/consent-framework)342