How to Fix SharePoint Hybrid TOC Errors
Why Your SharePoint Hybrid TOC Is Breaking
I've seen this exact scenario play out on dozens of enterprise deployments: everything looks fine in the SharePoint admin center, your hybrid wizard ran without errors, and then your SharePoint Hybrid TOC , the taxonomy term store replication or hybrid navigation Table of Contents , silently stops working. Pages load, but your managed navigation is missing, term groups aren't syncing between on-premises and SharePoint Online, or the entire hybrid navigation tree collapses with a generic "Something went wrong" banner.
The SharePoint Hybrid TOC is the mechanism that bridges on-premises SharePoint Server (2016, 2019, or Subscription Edition) term stores and navigation structures with SharePoint Online. It depends on a chain of interdependent components: the Server-to-Server (S2S) OAuth trust between your farm and Azure Active Directory, the Hybrid Sites Timer Job, the User Profile Application (UPA), the Managed Metadata Service Application proxy, and a correctly registered Azure AD app principal. If any single link in that chain breaks, and they do, constantly, your hybrid TOC fails.
Here's what makes SharePoint Hybrid TOC troubleshooting uniquely painful. The error messages you get are almost never helpful. You might see Access Denied (401), or a correlation ID that traces back to a token validation failure, or just a blank navigation panel. Microsoft's own error surface doesn't distinguish between "your S2S certificate expired" and "your term store proxy is misconfigured." Both show the same vague failure.
The root causes I see most often, roughly in order of frequency:
- Expired STS certificate, The on-premises Security Token Service certificate used for S2S trust has a limited lifespan. When it expires, all hybrid OAuth flows break silently.
- Broken or missing App Principal registration, The SharePoint Online app principal (
00000003-0000-0ff1-ce00-000000000000) loses its trust relationship with your on-premises farm after tenant changes or admin turnover. - Hybrid Taxonomy Replication Timer Job failures, The timer job responsible for syncing term groups between on-premises and SharePoint Online gets stuck, throttled, or simply disabled after a farm update.
- UPA connectivity issues, If your User Profile Application service can't reach SharePoint Online endpoints, the hybrid TOC navigation can't resolve user context, breaking personalized navigation.
- Reverse proxy misconfiguration, Enterprise deployments using F5, Citrix ADC, or Web Application Proxy for hybrid connectivity often have SSL offloading rules that strip the
Authorizationheader, killing the OAuth handshake. - Azure AD token endpoint changes, Microsoft periodically updates the Azure AD v2.0 token endpoint format. Older hybrid configurations still point to the v1.0 endpoint and fail post-tenant migration.
I know this is frustrating, especially when it blocks your entire intranet navigation or taxonomy governance workflow. The good news is that once you understand which layer is broken, the fixes are straightforward. Let's work through them systematically. Browse all Microsoft fix guides →
The Quick Fix, Try This First
Before going deep into diagnostics, there's one fix that resolves about 40% of SharePoint Hybrid TOC failures I encounter. The Hybrid Timer Job and the associated Managed Metadata service connection get into a bad state and simply need a reset. Here's the fastest path to recovery.
Open the SharePoint Management Shell on your on-premises SharePoint server, right-click it, choose Run as administrator. Then run this sequence:
# Step 1: Restart the SharePoint Timer Service
Stop-Service SPTimerV4
Start-Service SPTimerV4
# Step 2: Force the Hybrid Timer Job to run immediately
$job = Get-SPTimerJob | Where-Object {$_.Name -like "*HybridTaxonomy*" -or $_.Name -like "*HybridSites*"}
$job | ForEach-Object { $_.RunNow() }
# Step 3: Check the job status after ~2 minutes
Get-SPTimerJob | Where-Object {$_.Name -like "*Hybrid*"} | Select Name, LastRunTime, Status
Wait about two minutes, then check your SharePoint site's navigation or term store. If your hybrid TOC was failing because of a stuck timer job, it should now show the correct term groups and navigation nodes.
If that didn't fix it, check your STS certificate right now, this is the second most common quick win:
# Check the on-premises STS certificate expiry
$sts = Get-SPSecurityTokenServiceConfig
$sts.LocalLoginProvider.SigningCertificate | Select Subject, NotAfter
# Also check the root certificate
Get-SPTrustedRootAuthority | Select Name, Certificate | Format-List
If NotAfter is in the past or within the next 30 days, your certificate is expired or expiring, jump to Step 3 in the step-by-step section below. That's your culprit.
The S2S trust is the foundation of every SharePoint hybrid feature, including your hybrid TOC. Without a valid trust, no token exchange happens and everything downstream fails. Go to Central Administration → Security → Manage trust. You should see an entry for SharePoint Online, if it's missing entirely, your hybrid configuration was never completed or was deleted.
To validate it properly from PowerShell, run:
# List all trusted service token issuers
Get-SPTrustedSecurityTokenIssuer | Select Name, RegisteredIssuerName, IsSelfIssuer | Format-Table -AutoSize
# Specifically look for the SharePoint Online issuer
Get-SPTrustedSecurityTokenIssuer | Where-Object {$_.RegisteredIssuerName -like "*00000001-0000-0000-c000*"}
You should see an entry with a RegisteredIssuerName containing your tenant GUID. If the output is empty, the trust is broken. To re-establish it, you'll need your SharePoint Online tenant ID. Get it from the Azure portal under Azure Active Directory → Properties → Tenant ID.
# Re-establish S2S trust (replace YOUR-TENANT-ID with actual GUID)
$tenantId = "YOUR-TENANT-ID"
$stsMetadata = Invoke-WebRequest "https://accounts.accesscontrol.windows.net/$tenantId/metadata/json/1"
New-SPTrustedSecurityTokenIssuer -Name "SharePoint Online" -IsTrustBroker -MetadataEndPoint "https://accounts.accesscontrol.windows.net/$tenantId/metadata/json/1"
If the trust exists but looks wrong, remove and re-create it rather than trying to patch it, partial trusts cause intermittent hybrid TOC failures that are maddening to debug. After creating the trust, run an IIS Reset across all servers in the farm: iisreset /noforce. Give it five minutes, then check your hybrid navigation again.
This is the fix that enterprise admins forget until it bites them. The Security Token Service certificate used for hybrid OAuth has an expiry date. When it expires, your hybrid TOC stops working with no obvious error, it just silently breaks. Check it right now:
# Check current STS certificate details
$sts = Get-SPSecurityTokenServiceConfig
$cert = $sts.LocalLoginProvider.SigningCertificate
Write-Host "Subject: $($cert.Subject)"
Write-Host "Thumbprint: $($cert.Thumbprint)"
Write-Host "Expires: $($cert.NotAfter)"
Write-Host "Days remaining: $(($cert.NotAfter - (Get-Date)).Days)"
If days remaining is under 30, or negative, you need to renew it. SharePoint can generate a new self-signed STS certificate, but you also need to update SharePoint Online's trust with the new certificate. Here's the process:
# Generate a new STS certificate
$newCert = New-SPSelfSignedCertificate -FriendlyName "SharePoint STS" -CommonName "SharePoint STS" -AlternativeNames @() -OrganizationalUnit "IT" -Organization "Contoso" -Locality "Redmond" -State "WA" -Country "US" -Exportable -HashAlgorithm SHA256 -KeySize 2048 -KeyUsage None
# Assign it to STS
Set-SPSecurityTokenServiceConfig -SigningCertificateThumbprint $newCert.Thumbprint
iisreset /noforce
After updating the certificate on-premises, go to SharePoint Online admin center → Settings → Hybrid picker and re-run the hybrid configuration wizard. It will pick up the new certificate and update the trust. Alternatively, use the SharePoint Online Management Shell to update the trusted certificate directly. Once done, restart the timer service and give the hybrid TOC five minutes to re-establish. You should see your navigation tree populate correctly.
Your SharePoint Hybrid TOC taxonomy sync depends on the Managed Metadata Service Application being properly connected and having the right proxy configuration. I've seen setups where an upgrade or migration left the MMS proxy pointing to the old service application instance, silently breaking all term group replication.
Navigate to Central Administration → Application Management → Manage service applications. Find your Managed Metadata Service. Click on its connection (proxy), then check the properties, you should see a checkbox for "This service application is the default storage location for column specific term sets" and "This service application is the default storage location for site collection specific term sets." Both should be checked.
Now verify the hybrid term group replication is actually configured:
# Check the Managed Metadata service application
$mms = Get-SPServiceApplication | Where-Object {$_ -is [Microsoft.SharePoint.Taxonomy.MetadataWebServiceApplication]}
$mms | Select Name, Status, Id
# Check which term groups are marked for replication
Add-PSSnapin Microsoft.SharePoint.PowerShell -EA SilentlyContinue
$session = New-PSSession -ConnectionUri https://yourtenantname.sharepoint.com -Authentication Kerberos
# Note: for the term store, check via the UI in SharePoint Online Term Store Management
In SharePoint Online, go to SharePoint Admin Center → Term store. Look for any term groups that should be replicated from on-premises. If they're missing or stale, the replication timer job is failing. In Central Administration on-premises, navigate to Monitoring → Timer Jobs → Review job definitions, search for "Taxonomy," and check the Taxonomy Groups Replication job. Its last run time and status will tell you whether it's running at all. If the status shows Failed, check the ULS logs at the time of its last run, look for event category Taxonomy or Hybrid in the SharePoint ULS log viewer.
The hybrid TOC uses the User Profile Application to resolve user identity across the on-premises/cloud boundary. When UPA can't reach SharePoint Online, which happens after firewall rule changes, proxy updates, or expired credentials, your hybrid navigation personalization breaks and the TOC can't render user-specific navigation nodes correctly.
First, verify the UPA service is running:
# Check UPA service status
Get-SPServiceInstance | Where-Object {$_.TypeName -like "*User Profile*"} | Select Server, Status, TypeName
# Check the actual service application
Get-SPServiceApplication | Where-Object {$_ -is [Microsoft.Office.Server.Administration.UserProfileApplication]} | Select Name, Status
If those look healthy, test whether your on-premises farm can actually reach SharePoint Online endpoints. From your SharePoint application server, open PowerShell and run:
# Test connectivity to SharePoint Online
$testUri = "https://login.microsoftonline.com"
$result = Invoke-WebRequest -Uri $testUri -UseBasicParsing -TimeoutSec 10
Write-Host "Status: $($result.StatusCode)"
# Test the specific token endpoint
$tenantId = "YOUR-TENANT-ID"
$tokenEndpoint = "https://accounts.accesscontrol.windows.net/$tenantId/tokens/OAuth/2"
try {
$ping = Invoke-WebRequest -Uri $tokenEndpoint -Method HEAD -UseBasicParsing -TimeoutSec 10
Write-Host "Token endpoint reachable: $($ping.StatusCode)"
} catch {
Write-Host "Token endpoint FAILED: $($_.Exception.Message)"
}
If either of those fails, you have a network-level block. Check your proxy server settings. SharePoint on-premises needs to reach *.microsoftonline.com, *.sharepoint.com, accounts.accesscontrol.windows.net, and login.windows.net without SSL inspection breaking the certificate chain. If your proxy is doing SSL inspection, you need to whitelist those endpoints with passthrough.
To configure SharePoint to use a proxy for outbound connections:
# Set proxy for SharePoint outbound connections
$webProxy = New-Object System.Net.WebProxy("http://yourproxy.contoso.com:8080")
[System.Net.WebRequest]::DefaultWebProxy = $webProxy
# Or configure it in Central Admin:
# Central Admin → Security → Configure web proxy settings
Every SharePoint hybrid deployment relies on a specific Azure AD app principal with ID 00000003-0000-0ff1-ce00-000000000000 (SharePoint Online) being trusted on-premises. After tenant migrations, Azure AD conditional access policy changes, or accidental deletion by another admin, this app principal registration breaks, and your hybrid TOC fails with 401 errors that are incredibly hard to trace back to this cause.
To check and fix the app principal registration, open the SharePoint Management Shell as administrator and run:
# Check existing app principal registrations
Get-SPAppPrincipal -Site https://yourintranet.contoso.com -NameIdentifier "00000003-0000-0ff1-ce00-000000000000@YOUR-TENANT-ID"
# If the above returns nothing or an error, register it fresh
$site = Get-SPSite "https://yourintranet.contoso.com"
$tenantId = "YOUR-TENANT-ID"
$appPrincipal = Register-SPAppPrincipal -Site $site.RootWeb -NameIdentifier "00000003-0000-0ff1-ce00-000000000000@$tenantId" -DisplayName "SharePoint Online"
# Grant it the right permissions
Set-SPAppPrincipalPermission -Site $site.RootWeb -AppPrincipal $appPrincipal -Scope SiteSubscription -Right FullControl
After running this, you need to do an IIS reset across all servers in your farm and then restart the SharePoint Timer Service. Navigate back to a SharePoint site that should show the hybrid TOC navigation and do a hard refresh (Ctrl+Shift+R). If the app principal was the issue, you'll see the navigation populate within about 60 seconds as the new trust propagates. If you see error code AADSTS700016 or AADSTS90019 in your ULS logs, that confirms this is exactly the problem, the app wasn't found in the directory, and re-registering it is the correct fix.
Advanced Troubleshooting for SharePoint Hybrid TOC
Reading ULS Logs for Hybrid TOC Errors
The SharePoint Unified Logging System (ULS) is your best friend for deep hybrid TOC diagnostics. Generic browser errors tell you nothing. ULS tells you exactly which component failed and why. Enable verbose logging temporarily:
# Enable verbose logging for hybrid-related categories
Set-SPLogLevel -TraceSeverity Verbose -EventSeverity Information -Identity "SharePoint Server","Authentication Authorization","Topology"
# Then tail the log file in real-time (replace with your actual ULS log path)
Get-SPLogEvent -StartTime (Get-Date).AddMinutes(-5) | Where-Object {$_.Category -like "*Hybrid*" -or $_.Category -like "*Taxonomy*" -or $_.Category -like "*Authentication*"} | Select TimeStamp, Category, Level, Message | Format-List
Key event IDs to look for in the Windows Application Event Log (open Event Viewer → Windows Logs → Application):
- Event ID 8321, SharePoint Security Token Service authentication failure. Usually certificate-related.
- Event ID 5214, User Profile synchronization failure with SharePoint Online.
- Event ID 6398, Timer job execution failure. Check the job name in the details, if it contains "Hybrid" or "Taxonomy," that's your replication job failing.
- Event ID 8073, OAuth token validation error. Correlates to S2S trust problems.
Group Policy and Firewall Conflicts
In enterprise domain-joined environments, Group Policy can silently break hybrid TOC connectivity. The most common culprit is Internet Explorer Enhanced Security Configuration or TLS version enforcement policies. SharePoint's .NET components need TLS 1.2 minimum for SharePoint Online connections. Check your farm servers:
# Verify TLS 1.2 is enabled in the registry
Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" -Name "Enabled" -ErrorAction SilentlyContinue
# If not present or set to 0, enable it:
New-Item "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" -Force
Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" -Name "Enabled" -Value 1 -Type DWord
Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" -Name "DisabledByDefault" -Value 0 -Type DWord
Also check whether your domain's Group Policy has a Windows Firewall with Advanced Security rule blocking outbound 443 traffic to non-approved destinations. Your SharePoint servers need outbound 443 to the Microsoft 365 endpoint ranges listed in Microsoft's official IP/URL list (ID categories 1-4 for SharePoint Online). Work with your network team to verify those are whitelisted.
Hybrid Picker Re-Run Checklist
Sometimes the most efficient path is to re-run the Microsoft Support-recommended Hybrid Picker tool. Before you do, make sure: your account has Global Administrator in Microsoft 365, Farm Administrator rights on-premises, and shell access on the Central Admin server. The Hybrid Picker sits at SharePoint Admin Center → Settings → Configure hybrid. Run it and specifically re-enable "Hybrid Sites Features" and "Hybrid Taxonomy and Content Types", these are the features that power hybrid TOC navigation.
AADSTS error codes you can't resolve through app principal re-registration, your farm is on SharePoint Server 2016 with RTM build (no service packs applied) and hybrid features simply never worked, or if you suspect your Azure AD tenant has a broken trust configuration that requires Microsoft backend access to fix. Open a ticket at Microsoft Support and include your correlation IDs, ULS log snippets, and the output of Get-SPTrustedSecurityTokenIssuer, that gives them an instant head start.
Enterprise Reverse Proxy Fixes
If your hybrid deployment routes through a reverse proxy (F5 BIG-IP, Citrix ADC, Azure App Proxy, or Web Application Proxy on Windows Server), SSL offloading is a major cause of hybrid TOC failures. The proxy terminates SSL and re-encrypts traffic, which can strip or modify the Authorization Bearer token header that OAuth requires. Configure your reverse proxy to pass the Authorization, X-FORMS_BASED_AUTH_ACCEPTED, and MicrosoftSharePointTeamServices headers through untouched. On F5, this is a STREAM profile setting. On Citrix ADC, disable SSL rewrite policies for the SharePoint farm's VIPs and configure header preservation explicitly.