|
| 1 | +--- |
| 2 | +title: Authorize cross-tenant partner applications for Microsoft Planetary Computer Pro |
| 3 | +description: Learn how to authorize third-party geospatial data and service provider applications to access your Microsoft Planetary Computer Pro GeoCatalogs. |
| 4 | +author: aloverro |
| 5 | +ms.author: adamloverro |
| 6 | +ms.service: planetary-computer-pro |
| 7 | +ms.topic: how-to |
| 8 | +ms.date: 01/13/2026 |
| 9 | + |
| 10 | +#customer intent: As an administrator of my organizations geospatial enterprise and an operator of Microsoft Planetary Computer Pro, I need to authorize access to third party data or service provider applications my my Microsoft Planetary Computer Pro GeoCatalogs. |
| 11 | +--- |
| 12 | + |
| 13 | +# Authorize cross-tenant partner applications for Microsoft Planetary Computer Pro |
| 14 | + |
| 15 | +This article guides IT and cloud administrators through the process of authorizing a third-party partner application to access GeoCatalog resources. By completing these steps, you enable partner organizations—such as geospatial data providers or analytics services—to read from and write data to your Microsoft Planetary Computer Pro GeoCatalogs. |
| 16 | + |
| 17 | +## Prerequisites |
| 18 | + |
| 19 | +- Azure account with an active subscription - [create an account for free](https://azure.microsoft.com/free/?ref=microsoft.com&utm_source=microsoft.com&utm_medium=docs&utm_campaign=visualstudio) |
| 20 | +- An existing [GeoCatalog resource](./deploy-geocatalog-resource.md) |
| 21 | +- One of the following Microsoft Entra ID roles: |
| 22 | + - Global Administrator |
| 23 | + - Application Administrator |
| 24 | + - Cloud Application Administrator |
| 25 | +- Owner or User Access Administrator role on the GeoCatalog resource |
| 26 | +- Azure CLI installed and configured - [install the Azure CLI](/cli/azure/install-azure-cli) |
| 27 | +- Information from your partner: |
| 28 | + - Partner's Application (client) ID |
| 29 | + - Redirect URI configured in the partner's application registration (Optional) |
| 30 | + |
| 31 | +## Overview |
| 32 | + |
| 33 | +Authorizing a partner application involves three main steps: |
| 34 | + |
| 35 | +1. **Create a service principal** for the partner's application in your tenant |
| 36 | +1. **Grant admin consent** to the application's permission requests |
| 37 | +1. **Assign GeoCatalog roles** to the service principal |
| 38 | + |
| 39 | +<!-- NOTE: For MS Learn publishing, replace the Mermaid diagram below with a PNG image --> |
| 40 | + |
| 41 | +```mermaid |
| 42 | +flowchart LR |
| 43 | + A[Receive partner<br/>app details] --> B[Create service<br/>principal] |
| 44 | + B --> C[Grant admin<br/>consent] |
| 45 | + C --> D[Assign GeoCatalog<br/>Administrator role] |
| 46 | + D --> E[Partner can<br/>access GeoCatalog] |
| 47 | +``` |
| 48 | + |
| 49 | +## Create a service principal for the partner application |
| 50 | + |
| 51 | +A service principal is the representation of an application in your Microsoft Entra tenant. Creating a service principal for the partner's application ID establishes the identity that you can then grant permissions to. |
| 52 | + |
| 53 | +1. Sign in to Azure CLI with an account that has Application Administrator permissions: |
| 54 | + |
| 55 | + ```azurecli |
| 56 | + az login --tenant <your-tenant-id> |
| 57 | + ``` |
| 58 | +
|
| 59 | +1. Verify you're signed into the correct tenant: |
| 60 | +
|
| 61 | + ```azurecli |
| 62 | + az account show --query "{TenantId:tenantId, User:user.name}" -o table |
| 63 | + ``` |
| 64 | +
|
| 65 | +1. Check if a service principal already exists for the partner application: |
| 66 | +
|
| 67 | + ```azurecli |
| 68 | + az ad sp list --filter "appId eq '<partner-application-id>'" --query "[0].id" -o tsv |
| 69 | + ``` |
| 70 | +
|
| 71 | + If this command returns an object ID, the service principal already exists. Skip to the next section. |
| 72 | +
|
| 73 | +1. Create the service principal: |
| 74 | +
|
| 75 | + ```azurecli |
| 76 | + az ad sp create --id <partner-application-id> |
| 77 | + ``` |
| 78 | +
|
| 79 | + Example output: |
| 80 | +
|
| 81 | + ```json |
| 82 | + { |
| 83 | + "accountEnabled": true, |
| 84 | + "appId": "f914857f-af79-4a22-8a37-85e772c01b7f", |
| 85 | + "displayName": "Partner Geospatial App", |
| 86 | + "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", |
| 87 | + ... |
| 88 | + } |
| 89 | + ``` |
| 90 | +
|
| 91 | +1. Save the service principal's `id` value (object ID) for use in subsequent steps: |
| 92 | +
|
| 93 | + ```azurecli |
| 94 | + # Store the service principal object ID |
| 95 | + SP_ID=$(az ad sp list --filter "appId eq '<partner-application-id>'" --query "[0].id" -o tsv) |
| 96 | + echo "Service Principal ID: $SP_ID" |
| 97 | + ``` |
| 98 | +
|
| 99 | +## Grant admin consent to the partner application |
| 100 | +
|
| 101 | +Admin consent authorizes the partner application to use the requested permissions. This step is required before the application can authenticate against your tenant. Your partner should provide a link to perform this action as part of the application onboarding process. |
| 102 | +
|
| 103 | +> [!NOTE] |
| 104 | +> You can optionally contruct this URL yourself: |
| 105 | +> |
| 106 | +> Construct the admin consent URL using your tenant ID and the partner's application ID: |
| 107 | +> |
| 108 | +> ```text |
| 109 | +> https://login.microsoftonline.com/<your-tenant-id>/adminconsent?client_id=<partner-application-id>&redirect_uri=https://localhost:8080/callback |
| 110 | +> ``` |
| 111 | +> The redirect URI must match one of the URIs configured in the partner's application registration. Confirm the correct URI with your partner. |
| 112 | +
|
| 113 | +1. Open the URL in a web browser and sign in with a Global Administrator or Application Administrator account. |
| 114 | +
|
| 115 | +1. Review the requested permissions and select **Accept** to grant consent. |
| 116 | +
|
| 117 | + After consent is granted, you're redirected to the specified redirect URI. You can close this browser window. |
| 118 | +
|
| 119 | +1. Verify that admin consent was granted by checking the service principal's permissions: |
| 120 | +
|
| 121 | + ```azurecli |
| 122 | + az rest --method GET --url "https://graph.microsoft.com/v1.0/servicePrincipals/$SP_ID/oauth2PermissionGrants" |
| 123 | + ``` |
| 124 | +
|
| 125 | + Example output when consent has been granted: |
| 126 | +
|
| 127 | + ```json |
| 128 | + { |
| 129 | + "value": [ |
| 130 | + { |
| 131 | + "clientId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", |
| 132 | + "consentType": "AllPrincipals", |
| 133 | + "id": "abc123def456", |
| 134 | + "principalId": null, |
| 135 | + "resourceId": "98765432-abcd-ef12-3456-7890abcdef12", |
| 136 | + "scope": "User.Read" |
| 137 | + } |
| 138 | + ] |
| 139 | + } |
| 140 | + ``` |
| 141 | +
|
| 142 | + If the `value` array is empty, admin consent hasn't been granted yet. |
| 143 | +
|
| 144 | +### Alternative: Grant consent via Azure portal |
| 145 | +
|
| 146 | +You can also grant admin consent through the Microsoft Entra admin center: |
| 147 | +
|
| 148 | +1. Sign in to the [Microsoft Entra admin center](https://entra.microsoft.com/) |
| 149 | +1. Navigate to **Identity** > **Applications** > **Enterprise applications** |
| 150 | +1. Select the **Application Type** filter and set to value "All Applications" |
| 151 | +1. Find the partner application by using the search bar to enter the application name or ID. Select the partner application from the filtered list. |
| 152 | +1. Select **Security** > **Permissions** in the left sidebar |
| 153 | +1. Select **Grant admin consent for [your tenant]** |
| 154 | +1. Review and accept the permissions |
| 155 | +
|
| 156 | +## Assign the appropriate GeoCatalog role |
| 157 | +
|
| 158 | +The service principal for your data or service provider needs the appropriate role in order to interact with your GeoCatalog resources. Assign the **GeoCatalog Reader** role to applications that only need read access to your GeoCatalog. Assign the **GeoCatalog Administrator** role to applications that need to create collections, ingest data, and manage items in your GeoCatalog. |
| 159 | +
|
| 160 | +> [!NOTE] |
| 161 | +> The partner application integration feature is currently in preview and doesn't support a specific, limited access role for data or service provider partners. For this reason, it's recommended during the preview period that customers create a GeoCatalog resource dedicated to a specific partner to prevent access to other, organizational private, data. |
| 162 | +
|
| 163 | +### [GeoCatalog Administrator](#tab/geocatalog-administrator) |
| 164 | +1. Get your GeoCatalog resource ID: |
| 165 | +
|
| 166 | + ```azurecli |
| 167 | + # Set your resource details |
| 168 | + SUBSCRIPTION_ID="<your-subscription-id>" |
| 169 | + RESOURCE_GROUP="<your-resource-group>" |
| 170 | + GEOCATALOG_NAME="<your-geocatalog-name>" |
| 171 | +
|
| 172 | + # Construct the resource ID |
| 173 | + GEOCATALOG_RESOURCE_ID="/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Orbital/geoCatalogs/$GEOCATALOG_NAME" |
| 174 | + ``` |
| 175 | +
|
| 176 | +1. Verify the GeoCatalog resource exists and you have access: |
| 177 | +
|
| 178 | + ```azurecli |
| 179 | + az resource show --ids $GEOCATALOG_RESOURCE_ID --query "{Name:name, Location:location, Type:type}" -o table |
| 180 | + ``` |
| 181 | +
|
| 182 | +1. Find the desired role definition: |
| 183 | +
|
| 184 | +
|
| 185 | + ```azurecli |
| 186 | + az role definition list --name "GeoCatalog Administrator" --query "[0].id" -o tsv |
| 187 | + ``` |
| 188 | +
|
| 189 | +1. Check if the role assignment already exists: |
| 190 | +
|
| 191 | + ```azurecli |
| 192 | + az role assignment list --assignee $SP_ID --scope $GEOCATALOG_RESOURCE_ID --query "[?roleDefinitionName=='GeoCatalog Administrator']" -o table |
| 193 | + ``` |
| 194 | +
|
| 195 | +1. Create the role assignment: |
| 196 | +
|
| 197 | + ```azurecli |
| 198 | + az role assignment create \ |
| 199 | + --assignee $SP_ID \ |
| 200 | + --role "GeoCatalog Administrator" \ |
| 201 | + --scope $GEOCATALOG_RESOURCE_ID |
| 202 | + ``` |
| 203 | +
|
| 204 | + Example output: |
| 205 | +
|
| 206 | + ```json |
| 207 | + { |
| 208 | + "id": "/subscriptions/.../providers/Microsoft.Authorization/roleAssignments/...", |
| 209 | + "principalId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", |
| 210 | + "roleDefinitionName": "GeoCatalog Administrator", |
| 211 | + "scope": "/subscriptions/.../resourceGroups/.../providers/Microsoft.Orbital/geoCatalogs/...", |
| 212 | + ... |
| 213 | + } |
| 214 | + ``` |
| 215 | +### [GeoCatalog Reader](#tab/geocatalog-reader) |
| 216 | +1. Get your GeoCatalog resource ID: |
| 217 | +
|
| 218 | + ```azurecli |
| 219 | + # Set your resource details |
| 220 | + SUBSCRIPTION_ID="<your-subscription-id>" |
| 221 | + RESOURCE_GROUP="<your-resource-group>" |
| 222 | + GEOCATALOG_NAME="<your-geocatalog-name>" |
| 223 | +
|
| 224 | + # Construct the resource ID |
| 225 | + GEOCATALOG_RESOURCE_ID="/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Orbital/geoCatalogs/$GEOCATALOG_NAME" |
| 226 | + ``` |
| 227 | +
|
| 228 | +1. Verify the GeoCatalog resource exists and you have access: |
| 229 | +
|
| 230 | + ```azurecli |
| 231 | + az resource show --ids $GEOCATALOG_RESOURCE_ID --query "{Name:name, Location:location, Type:type}" -o table |
| 232 | + ``` |
| 233 | +
|
| 234 | +1. Find the desired role definition: |
| 235 | +
|
| 236 | +
|
| 237 | + ```azurecli |
| 238 | + az role definition list --name "GeoCatalog Reader" --query "[0].id" -o tsv |
| 239 | + ``` |
| 240 | +
|
| 241 | +1. Check if the role assignment already exists: |
| 242 | +
|
| 243 | + ```azurecli |
| 244 | + az role assignment list --assignee $SP_ID --scope $GEOCATALOG_RESOURCE_ID --query "[?roleDefinitionName=='GeoCatalog Reader']" -o table |
| 245 | + ``` |
| 246 | +
|
| 247 | +1. Create the role assignment: |
| 248 | +
|
| 249 | + ```azurecli |
| 250 | + az role assignment create \ |
| 251 | + --assignee $SP_ID \ |
| 252 | + --role "GeoCatalog Reader" \ |
| 253 | + --scope $GEOCATALOG_RESOURCE_ID |
| 254 | + ``` |
| 255 | +
|
| 256 | + Example output: |
| 257 | +
|
| 258 | + ```json |
| 259 | + { |
| 260 | + "id": "/subscriptions/.../providers/Microsoft.Authorization/roleAssignments/...", |
| 261 | + "principalId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", |
| 262 | + "roleDefinitionName": "GeoCatalog Reader", |
| 263 | + "scope": "/subscriptions/.../resourceGroups/.../providers/Microsoft.Orbital/geoCatalogs/...", |
| 264 | + ... |
| 265 | + } |
| 266 | + ``` |
| 267 | +
|
| 268 | +### Alternative: Assign roles via Azure portal |
| 269 | +
|
| 270 | +You can also assign roles through the Azure portal: |
| 271 | +
|
| 272 | +1. Sign in to the [Azure portal](https://portal.azure.com/) |
| 273 | +1. Navigate to your GeoCatalog resource |
| 274 | +1. Select **Access control (IAM)** in the left sidebar |
| 275 | +1. Select **Add** > **Add role assignment** |
| 276 | +1. Select **GeoCatalog Administrator** or **GeoCatalog Reader** from the list of roles |
| 277 | +1. Select **Next** |
| 278 | +1. Select **User, group, or service principal** |
| 279 | +1. Select **Select members** and search for the partner application name |
| 280 | +1. Select the partner application and choose **Select** |
| 281 | +1. Select **Review + assign** to complete the assignment |
| 282 | +
|
| 283 | +## Verify the configuration |
| 284 | +
|
| 285 | +After completing the authorization steps, verify that the partner can access your GeoCatalog: |
| 286 | +
|
| 287 | +1. Confirm the service principal exists and has the correct application ID: |
| 288 | +
|
| 289 | + ```azurecli |
| 290 | + az ad sp show --id $SP_ID --query "{DisplayName:displayName, AppId:appId, Id:id}" -o table |
| 291 | + ``` |
| 292 | +
|
| 293 | +1. Verify the role assignment: |
| 294 | +
|
| 295 | + ```azurecli |
| 296 | + az role assignment list --assignee $SP_ID --scope $GEOCATALOG_RESOURCE_ID -o table |
| 297 | + ``` |
| 298 | +
|
| 299 | +1. Notify your partner that authorization is complete. Provide them with: |
| 300 | + - The GeoCatalog URI (found in the Azure portal on your GeoCatalog resource's Overview page) |
| 301 | +
|
| 302 | +## Grant access to more GeoCatalogs |
| 303 | +
|
| 304 | +To grant the same partner access to more GeoCatalog resources, repeat only the [Assign the appropriate GeoCatalog role](#assign-the-appropriate-geocatalog-role) section for each resource. The service principal and admin consent only need to be configured once per tenant. |
| 305 | +
|
| 306 | +## Revoke partner access |
| 307 | +
|
| 308 | +To remove a partner's access to your GeoCatalog: |
| 309 | +
|
| 310 | +### Remove role assignment only |
| 311 | +
|
| 312 | +To revoke access to a specific GeoCatalog while preserving access to others: |
| 313 | +
|
| 314 | +```azurecli |
| 315 | +az role assignment delete --assignee $SP_ID --scope $GEOCATALOG_RESOURCE_ID --role "GeoCatalog Administrator" |
| 316 | +``` |
| 317 | +Or |
| 318 | + |
| 319 | +```azurecli |
| 320 | +az role assignment delete --assignee $SP_ID --scope $GEOCATALOG_RESOURCE_ID --role "GeoCatalog Reader" |
| 321 | +``` |
| 322 | + |
| 323 | +### Remove all access |
| 324 | + |
| 325 | +To completely remove the partner application from your tenant: |
| 326 | + |
| 327 | +```azurecli |
| 328 | +# Delete the service principal |
| 329 | +az ad sp delete --id $SP_ID |
| 330 | +``` |
| 331 | + |
| 332 | +> [!WARNING] |
| 333 | +> Deleting the service principal removes all role assignments and consent grants for that application across your entire tenant. |
| 334 | +
|
| 335 | +## Troubleshooting |
| 336 | + |
| 337 | +### Service principal creation fails |
| 338 | + |
| 339 | +If you receive an error when creating the service principal, verify that: |
| 340 | + |
| 341 | +- The partner's application ID is correct |
| 342 | +- The partner's application is configured for multitenant access |
| 343 | +- You have Application Administrator or Global Administrator role |
| 344 | + |
| 345 | +### Admin consent fails |
| 346 | + |
| 347 | +If admin consent fails: |
| 348 | + |
| 349 | +- Verify the redirect URI matches the partner's application configuration |
| 350 | +- Ensure you're signed in with sufficient privileges (Global Administrator or Application Administrator) |
| 351 | +- Check if your tenant has policies that restrict consent to external applications |
| 352 | + |
| 353 | +### Role assignment fails |
| 354 | + |
| 355 | +If the role assignment fails: |
| 356 | + |
| 357 | +- Verify you have Owner role on the GeoCatalog resource |
| 358 | +- Confirm the GeoCatalog resource ID is correct |
| 359 | +- Ensure the GeoCatalog Administrator role definition exists in your subscription |
| 360 | + |
| 361 | +## Related content |
| 362 | + |
| 363 | +- [Working with partner applications](./working-with-partner-applications.md) |
| 364 | +- [Configure a cross-tenant application](./configure-cross-tenant-application.md) |
| 365 | +- [Configure application authentication for Microsoft Planetary Computer Pro](./application-authentication.md) |
| 366 | +- [Manage access for Microsoft Planetary Computer Pro](./manage-access.md) |
0 commit comments