Fix it now
403 means the service knows exactly who you are and will not let you in. Microsoft documents it as access being denied because the caller does not have enough permission, or does not have a required licence – and where Conditional Access applies, as a 403 carrying error=insufficient_claims. 401 is the different problem: no usable identity was presented.
Connect-SPOService -Url https://contoso-admin.sharepoint.com
Get-SPOSite -Identity https://contoso.sharepoint.com/sites/team | Select-Object LockState,StorageQuota,StorageUsageCurrent
- Read LockState first. NoAccess blocks all traffic and returns 403 unless a redirect URL is configured; ReadOnly refuses writes with a maintenance message. Neither is a permissions problem.
- Confirm which account the browser is really using. Open a private window, sign in deliberately, and reproduce the error there.
- On the site, open Settings then Site permissions and run Check Permissions against the failing user. It reports what they have and which group grants it.
- Narrow the scope: site root, then library, then folder, then file. The level where it starts failing is where inheritance was broken.
- If only external people are refused, check sharing at both levels – a site can be at the same or a more restrictive setting than the organisation, never a more permissive one.
- If the user works in the office and fails on a personal device, read the Entra sign-in record; unmanaged-device restrictions have their own Access Denied text.
If the user can do the thing they were trying to do, stop here. If the account is fine and the answer is still no, the next section works through the layers above the permission model.
Why it happens
SharePoint evaluates every request against the permissions that apply at the exact scope you asked for. By default a library inherits from the site and an item inherits from the library, so one decision covers everything. The moment somebody shares a single file or breaks inheritance on one folder, that object gets its own permission set and stops following the site. Weeks later nobody remembers doing it, and Check Permissions at the site level reports access the item does not honour.
Above that sits a second layer that has nothing to do with permissions. Site lock states are set directly: NoAccess blocks all traffic to a site and returns 403 where no redirect URL is configured, ReadOnly makes it read-only with a maintenance message, and neither can be applied to the root site collection. Sharing settings decide whether external people can be granted anything at all, with the documented rule that a site’s setting must be at the same or a more restrictive level than the organisation’s. Device restrictions decide whether a session from a particular device may use the access it holds.
For code and integrations the picture is the same shape with different words. Microsoft’s Graph documentation defines accessDenied as the caller not having permission to perform the action, and states that a 403 can also mean the caller does not have a required licence. An application that authenticates successfully still gets 403 if its granted permissions do not cover the operation, if it was granted specific sites and not this one, or if the tenant blocks the authentication method it is using. The token is valid; the authorisation behind it is not.
Permission inheritance was broken at a lower scope
You have this one if The user can open the site but not one library, folder or file, and Check Permissions at site level shows access the item does not honour.
- Open the library or item, then Advanced permissions settings, and look for the notice that the object has unique permissions.
- Run Check Permissions at that scope, not at the site, to see what the user actually has there.
- Grant the missing permission at that scope, or restore inheritance from the parent if the unique set is no longer wanted.
Restoring inheritance discards the unique permissions on that object. Note who currently has access first, because you cannot undo it with a click.
The site is locked or read-only
You have this one if Reading works and every write fails, for everyone including site owners – or the whole site returns 403 for everybody.
- Read the site’s LockState and its storage usage against quota.
- If a lock was set deliberately, clear it with
Set-SPOSite -Identity <url> -LockState Unlockonce you know why it was applied. - If storage is the cause, free space or raise the site limit; a site over its limit stops accepting new content.
- Confirm the site is not held read-only by a retention or hold arrangement.
Sharing is restricted at tenant or site level
You have this one if Only external or guest users are refused, and internal staff have no trouble.
- In the SharePoint admin center open Policies then Sharing and read the organisation-level setting.
- Check the individual site as well: it must be at the same or a more restrictive setting than the organisation, and can never be more permissive.
- Confirm the guest has actually redeemed their invitation and exists in the directory.
- Check whether their domain is caught by an allow or deny list.
The device is unmanaged and the tenant restricts that
You have this one if The message reads: Access Denied. Due to organization policy, you can’t access this resource from this untrusted device.
- That text is the documented block for access from unmanaged devices, enforced through Conditional Access.
- Direct the user to a managed device if the restriction is intended.
- If limited access is configured rather than a block, expect browser-only use with no download, print, sync or app access – including the Office desktop applications.
An application has a token but not the right permission
You have this one if A script or integration fails with 403 or accessDenied while a person using the same site succeeds.
- Check the permissions granted to the app registration, and whether admin consent was actually given.
- If the app uses site-scoped access, confirm this site was among those granted.
- Confirm the tenant permits the authentication method the app uses.
- Test the same call as a signed-in user to establish whether the failure is the app’s identity or the permission model.
Full reference
Which layer is refusing you
| Pattern | Where to look |
|---|---|
| One user, one library or folder | Broken permission inheritance at that scope |
| One user, everything on the site | Removed from the site group, or a deny applied at site level |
| Everyone, read works and writing fails | The site is read-only, often because it is at its storage limit |
| Everyone, nothing loads at all | LockState NoAccess on the site |
| External guests only | Sharing restricted at organisation or site level, or the invitation was never redeemed |
| Works in the office, fails from home | Conditional Access, device compliance or a location rule |
| A script or app only | Missing application permission, site-scoped consent, or a blocked authentication method |
The lock states, and what each one does
| LockState | Effect |
|---|---|
| NoAccess | Blocks all traffic to the site. Traffic is redirected if NoAccessRedirectUrl is configured on the tenant; otherwise a 403 is returned |
| ReadOnly | The site becomes read-only and displays a message saying it is under maintenance |
| Unlock | Removes the lock state |
None of these can be set on the root site collection, and none of them is visible in the permission model. A site owner looking at Site permissions will see nothing wrong, which is exactly why LockState is the first thing to read rather than the last.
401 against 403, in practice
Microsoft defines 401 as required authentication information being missing or not valid for the resource, and 403 as access denied to the requested resource where the caller lacks permission or a required licence. In practice that means 401 sends you to the sign-in: the token is missing, expired, or issued for the wrong audience. 403 sends you to the authorisation: the identity is fine and the answer is still no. Chasing a 403 with more sign-in attempts is the single most common waste of time on this error, and the licence clause is worth remembering too – a 403 can mean the caller is not licensed for what they asked for.
Conditional Access, seen from the API
Where Conditional Access policies apply to a resource, Microsoft documents that the response is an HTTP 403 carrying error=insufficient_claims. That is a useful signal in a log: it separates a policy decision from a permission decision without needing access to the Entra sign-in records. An application that handles it properly can prompt for the additional claims rather than failing outright.
Check Permissions, and what it cannot see
- It is the right tool for the permission layer and reports which group grants what.
- It does not see lock states, sharing settings, retention holds or Conditional Access.
- A user who passes Check Permissions and still gets 403 is being stopped by one of those.
- Run it at the failing scope, not at the site, or you will confirm access the object does not honour.
- Site collection administrators bypass most permission checks but not the layers above the permission model.
Every code this article covers
| Code | What it points at | Source |
|---|---|---|
403 FORBIDDEN |
Access is denied to the requested resource; the caller does not have enough permission, or does not have a required licence. Where Conditional Access applies, a 403 with error=insufficient_claims is returned | Microsoft Learn |
Access Denied |
The interface form of the same refusal. Microsoft documents the unmanaged-device wording exactly: access denied because organisation policy blocks the resource from an untrusted device. A site with LockState NoAccess also returns 403 | Microsoft Learn |
401 Unauthorized |
Required authentication information is either missing or not valid for the resource | Microsoft Learn |
0x8004e4d0 |
Not listed on Microsoft’s OneDrive error code page. Seen from the sync client when the service refuses access to the site or library it is trying to sync; diagnose it as a 403 at that scope | not published by the vendor |
accessDenied |
The caller does not have permission to perform the action | Microsoft Learn |
Confirm the fix worked
- The affected user reproduces the original action and it now succeeds.
- Check Permissions at the exact scope that was failing reports the expected permission.
Get-SPOSiteshows LockState Unlock and storage within the site’s limit.- For an application, the failing call returns something other than 403 or accessDenied.
Questions people ask about this
Does fixing this need a different licence?
Usually not – permissions, sharing settings and lock states cost nothing to change. Two exceptions are worth knowing: Microsoft documents 403 as also covering a caller who does not have a required licence, and a site that has gone read-only because the tenant is out of storage needs storage rather than permissions.
What is the difference between 401 and 403 in practice?
401 means fix the sign-in: the token is missing, expired or for the wrong audience. 403 means fix the authorisation: the identity is fine and the answer is still no. Retrying a 403 with more sign-in attempts wastes time.
Why can a site owner get Access Denied on their own site?
Because ownership does not override unique permissions further down, a lock state, a retention hold or a Conditional Access rule. Site collection administrators bypass most permission checks; they do not bypass the layers above the permission model.
How do I tell a Conditional Access refusal from a permissions one?
Look for error=insufficient_claims on the 403. Microsoft documents that as what a resource returns when Conditional Access policies apply, which distinguishes it from an ordinary permission denial without leaving the log.
Is Check Permissions reliable?
For the permission layer, yes – it names the group that grants access. It cannot see sharing settings, lock states or device restrictions, so a user who passes it and still gets 403 is being stopped somewhere else.
