Azure Maps-fiók védelme SAS-jogkivonattal
Ez a cikk azt ismerteti, hogyan hozhat létre Azure Maps-fiókot egy biztonságosan tárolt SAS-jogkivonattal, amellyel meghívhatja az Azure Maps REST API-t.
Előfeltételek
Azure-előfizetés. Ha még nem rendelkezik Azure-fiókkal, regisztráljon egy ingyenes fiókra.
Tulajdonosi szerepkör engedélye az Azure-előfizetésben. A tulajdonosi engedélyekre a következőkhöz van szüksége:
Példaforgatókönyv: SAS-jogkivonat biztonságos tárolása
Az SAS-jogkivonat hitelesítő adatai az általa megadott hozzáférési szintet biztosítják bárkinek, aki birtokolja, amíg a jogkivonat le nem jár, vagy a hozzáférést vissza nem vonják. Az SAS-jogkivonat-hitelesítést használó alkalmazásoknak biztonságosan kell tárolniuk a kulcsokat.
Ez a forgatókönyv biztonságosan tárol egy SAS-jogkivonatot titkos kulcsként a Key Vaultban, és elosztja a jogkivonatot egy nyilvános ügyfélen. Az alkalmazás életciklus-eseményei új SAS-jogkivonatokat hozhatnak létre a meglévő jogkivonatokat használó aktív kapcsolatok megszakítása nélkül.
A Key Vault konfigurálásával kapcsolatos további információkért tekintse meg az Azure Key Vault fejlesztői útmutatóját.
Az alábbi példaforgatókönyv két Azure Resource Manager-sablon üzembe helyezését használja a következő lépések végrehajtásához:
- Kulcstartó létrehozása.
- Hozzon létre egy felhasználó által hozzárendelt felügyelt identitást.
- Azure-szerepköralapú hozzáférés-vezérlési (RBAC) Azure Maps-adatolvasó szerepkör hozzárendelése a felhasználó által hozzárendelt felügyelt identitáshoz.
- Hozzon létre egy Azure Maps-fiókot egy több forrásból származó erőforrásmegosztási (CORS) konfigurációval, és csatolja a felhasználó által hozzárendelt felügyelt identitást.
- SAS-jogkivonat létrehozása és mentése az Azure Key Vaultban.
- Kérje le az SAS-jogkivonat titkos kulcsát a kulcstartóból.
- Hozzon létre egy Azure Maps REST API-kérést, amely az SAS-jogkivonatot használja.
Ha végzett, látnia kell az Azure Maps Search Address (Non-Batch)
REST API-eredményeit a PowerShellben az Azure CLI-vel. Az Azure-erőforrások üzembe helyezése engedélyekkel az Azure Maps-fiókhoz való csatlakozáshoz. A maximális sebességkorlát, az engedélyezett régiók, localhost
a konfigurált CORS-szabályzat és az Azure RBAC vezérlői vannak.
Azure-erőforrások üzembe helyezése az Azure CLI-vel
Az alábbi lépések bemutatják, hogyan hozhat létre és konfigurálhat Azure Maps-fiókot SAS-jogkivonat-hitelesítéssel. Ebben a példában az Azure CLI egy PowerShell-példányban fut.
Jelentkezzen be az Azure-előfizetésbe a következővel
az login
: .Regisztrálja a Key Vaultot, a felügyelt identitásokat és az Azure Mapset az előfizetéséhez.
az provider register --namespace Microsoft.KeyVault az provider register --namespace Microsoft.ManagedIdentity az provider register --namespace Microsoft.Maps
Kérje le a Microsoft Entra objektumazonosítóját.
$id = $(az rest --method GET --url 'https://graph.microsoft.com/v1.0/me?$select=id' --headers 'Content-Type=application/json' --query "id")
Hozzon létre egy prereq.azuredeploy.json nevű sablonfájlt a következő tartalommal:
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "location": { "type": "string", "defaultValue": "[resourceGroup().location]", "metadata": { "description": "Specifies the location for all the resources." } }, "keyVaultName": { "type": "string", "defaultValue": "[concat('vault', uniqueString(resourceGroup().id))]", "metadata": { "description": "Specifies the name of the key vault." } }, "userAssignedIdentityName": { "type": "string", "defaultValue": "[concat('identity', uniqueString(resourceGroup().id))]", "metadata": { "description": "The name for your managed identity resource." } }, "objectId": { "type": "string", "metadata": { "description": "Specifies the object ID of a user, service principal, or security group in the Azure AD tenant for the vault. The object ID must be unique for the set of access policies. Get it by using Get-AzADUser or Get-AzADServicePrincipal cmdlets." } }, "secretsPermissions": { "type": "array", "defaultValue": [ "list", "get", "set" ], "metadata": { "description": "Specifies the permissions to secrets in the vault. Valid values are: all, get, list, set, delete, backup, restore, recover, and purge." } } }, "resources": [ { "type": "Microsoft.ManagedIdentity/userAssignedIdentities", "name": "[parameters('userAssignedIdentityName')]", "apiVersion": "2018-11-30", "location": "[parameters('location')]" }, { "apiVersion": "2021-04-01-preview", "type": "Microsoft.KeyVault/vaults", "name": "[parameters('keyVaultName')]", "location": "[parameters('location')]", "properties": { "tenantId": "[subscription().tenantId]", "sku": { "name": "Standard", "family": "A" }, "enabledForTemplateDeployment": true, "accessPolicies": [ { "objectId": "[parameters('objectId')]", "tenantId": "[subscription().tenantId]", "permissions": { "secrets": "[parameters('secretsPermissions')]" } } ] } } ], "outputs": { "userIdentityResourceId": { "type": "string", "value": "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('userAssignedIdentityName'))]" }, "userAssignedIdentityPrincipalId": { "type": "string", "value": "[reference(parameters('userAssignedIdentityName')).principalId]" }, "keyVaultName": { "type": "string", "value": "[parameters('keyVaultName')]" } } }
Telepítse az előző lépésben létrehozott előfeltétel-erőforrásokat. Adja meg a saját értékét.
<group-name>
Ügyeljen arra, hogy ugyanaztlocation
használja, mint az Azure Maps-fiókot.az group create --name <group-name> --location "East US" $outputs = $(az deployment group create --name ExampleDeployment --resource-group <group-name> --template-file "./prereq.azuredeploy.json" --parameters objectId=$id --query "[properties.outputs.keyVaultName.value, properties.outputs.userAssignedIdentityPrincipalId.value, properties.outputs.userIdentityResourceId.value]" --output tsv)
Hozzon létre egy sablonfájlt azuredeploy.json az Azure Maps-fiók, a szerepkör-hozzárendelés és az SAS-jogkivonat kiépítéséhez.
Feljegyzés
Azure Maps Gen1 tarifacsomag kivonása
A Gen1 tarifacsomag elavult, és 26.09.15-én megszűnik. A Gen2 tarifacsomag az 1. generációs (S0 és S1) tarifacsomagot váltja fel. Ha az Azure Maps-fiókjában a Gen1 tarifacsomag van kiválasztva, a kivonás előtt átválthat Gen2-díjszabásra, ellenkező esetben az automatikusan frissül. További információ: Az Azure Maps-fiók tarifacsomagjának kezelése.
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "location": { "type": "string", "defaultValue": "[resourceGroup().location]", "metadata": { "description": "Specifies the location for all the resources." } }, "keyVaultName": { "type": "string", "metadata": { "description": "Specifies the resourceId of the key vault." } }, "accountName": { "type": "string", "defaultValue": "[concat('map', uniqueString(resourceGroup().id))]", "metadata": { "description": "The name for your Azure Maps account." } }, "userAssignedIdentityResourceId": { "type": "string", "metadata": { "description": "Specifies the resourceId for the user assigned managed identity resource." } }, "userAssignedIdentityPrincipalId": { "type": "string", "metadata": { "description": "Specifies the resourceId for the user assigned managed identity resource." } }, "pricingTier": { "type": "string", "allowedValues": [ "S0", "S1", "G2" ], "defaultValue": "G2", "metadata": { "description": "The pricing tier for the account. Use S0 for small-scale development. Use S1 or G2 for large-scale applications." } }, "kind": { "type": "string", "allowedValues": [ "Gen1", "Gen2" ], "defaultValue": "Gen2", "metadata": { "description": "The pricing tier for the account. Use Gen1 for small-scale development. Use Gen2 for large-scale applications." } }, "guid": { "type": "string", "defaultValue": "[guid(resourceGroup().id)]", "metadata": { "description": "Input string for new GUID associated with assigning built in role types." } }, "startDateTime": { "type": "string", "defaultValue": "[utcNow('u')]", "metadata": { "description": "Current Universal DateTime in ISO 8601 'u' format to use as the start of the SAS token." } }, "duration" : { "type": "string", "defaultValue": "P1Y", "metadata": { "description": "The duration of the SAS token. P1Y is maximum, ISO 8601 format is expected." } }, "maxRatePerSecond": { "type": "int", "defaultValue": 500, "minValue": 1, "maxValue": 500, "metadata": { "description": "The approximate maximum rate per second the SAS token can be used." } }, "signingKey": { "type": "string", "defaultValue": "primaryKey", "allowedValues": [ "primaryKey", "seconaryKey" ], "metadata": { "description": "The specified signing key which will be used to create the SAS token." } }, "allowedOrigins": { "type": "array", "defaultValue": [], "maxLength": 10, "metadata": { "description": "The specified application's web host header origins (example: https://www.azure.com) which the Azure Maps account allows for CORS." } }, "allowedRegions": { "type": "array", "defaultValue": [], "metadata": { "description": "The specified SAS token allowed locations where the token may be used." } } }, "variables": { "accountId": "[resourceId('Microsoft.Maps/accounts', parameters('accountName'))]", "Azure Maps Data Reader": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '423170ca-a8f6-4b0f-8487-9e4eb8f49bfa')]", "sasParameters": { "signingKey": "[parameters('signingKey')]", "principalId": "[parameters('userAssignedIdentityPrincipalId')]", "maxRatePerSecond": "[parameters('maxRatePerSecond')]", "start": "[parameters('startDateTime')]", "expiry": "[dateTimeAdd(parameters('startDateTime'), parameters('duration'))]", "regions": "[parameters('allowedRegions')]" } }, "resources": [ { "name": "[parameters('accountName')]", "type": "Microsoft.Maps/accounts", "apiVersion": "2023-06-01", "location": "[parameters('location')]", "sku": { "name": "[parameters('pricingTier')]" }, "kind": "[parameters('kind')]", "properties": { "cors": { "corsRules": [ { "allowedOrigins": "[parameters('allowedOrigins')]" } ] } }, "identity": { "type": "UserAssigned", "userAssignedIdentities": { "[parameters('userAssignedIdentityResourceId')]": {} } } }, { "apiVersion": "2020-04-01-preview", "name": "[concat(parameters('accountName'), '/Microsoft.Authorization/', parameters('guid'))]", "type": "Microsoft.Maps/accounts/providers/roleAssignments", "dependsOn": [ "[parameters('accountName')]" ], "properties": { "roleDefinitionId": "[variables('Azure Maps Data Reader')]", "principalId": "[parameters('userAssignedIdentityPrincipalId')]", "principalType": "ServicePrincipal" } }, { "apiVersion": "2021-04-01-preview", "type": "Microsoft.KeyVault/vaults/secrets", "name": "[concat(parameters('keyVaultName'), '/', parameters('accountName'))]", "dependsOn": [ "[variables('accountId')]" ], "tags": { "signingKey": "[variables('sasParameters').signingKey]", "start" : "[variables('sasParameters').start]", "expiry" : "[variables('sasParameters').expiry]" }, "properties": { "value": "[listSas(variables('accountId'), '2023-06-01', variables('sasParameters')).accountSasToken]" } } ] }
Helyezze üzembe a sablont a Key Vault azonosítóparamétereivel és az előző lépésben létrehozott felügyelt identitáserőforrásokkal. Adja meg a saját értékét.
<group-name>
Az SAS-jogkivonat létrehozásakor a paramétert aallowedRegions
következőreeastus
állítja: ,westus2
éswestcentralus
. Ezeket a helyeket használva HTTP-kéréseket kezdeményezhet aus.atlas.microsoft.com
végpont felé.Fontos
Az SAS-jogkivonatot a kulcstartóba mentve megakadályozhatja, hogy a hitelesítő adatai megjelenjenek az Azure üzembe helyezési naplóiban. Az SAS-jogkivonat titkos
tags
kódja tartalmazza a kezdő, a lejárati és az aláírókulcs nevét is, így megjelenítheti, hogy mikor jár le az SAS-jogkivonat.az deployment group create --name ExampleDeployment --resource-group <group-name> --template-file "./azuredeploy.json" --parameters keyVaultName="$($outputs[0])" userAssignedIdentityPrincipalId="$($outputs[1])" userAssignedIdentityResourceId="$($outputs[2])" allowedOrigins="['http://localhost']" allowedRegions="['eastus', 'westus2', 'westcentralus']" maxRatePerSecond="10"
Keresse meg és mentse az egyetlen SAS-jogkivonat titkos kulcsának másolatát a Key Vaultból.
$secretId = $(az keyvault secret list --vault-name $outputs[0] --query "[? contains(name,'map')].id" --output tsv) $sasToken = $(az keyvault secret show --id "$secretId" --query "value" --output tsv)
Tesztelje az SAS-jogkivonatot egy Azure Maps-végpontra irányuló kéréssel. Ez a példa azt határozza meg, hogy a
us.atlas.microsoft.com
kérése az USA földrajzi helyéhez legyen irányítva. Az SAS-jogkivonat lehetővé teszi az USA földrajzi régióinak használatát.az rest --method GET --url 'https://us.atlas.microsoft.com/search/address/json?api-version=1.0&query=1 Microsoft Way, Redmond, WA 98052' --headers "Authorization=jwt-sas $($sasToken)" --query "results[].address"
Teljes példa szkriptre
A teljes példa futtatásához a következő sablonfájloknak ugyanabban a könyvtárban kell lenniük, mint az aktuális PowerShell-munkamenet:
- prereq.azuredeploy.json a kulcstartó és a felügyelt identitás létrehozásához.
- azuredeploy.json az Azure Maps-fiók létrehozásához, a szerepkör-hozzárendelés és a felügyelt identitás konfigurálásához, valamint az SAS-jogkivonat kulcstartóban való tárolásához.
az login
az provider register --namespace Microsoft.KeyVault
az provider register --namespace Microsoft.ManagedIdentity
az provider register --namespace Microsoft.Maps
$id = $(az rest --method GET --url 'https://graph.microsoft.com/v1.0/me?$select=id' --headers 'Content-Type=application/json' --query "id")
az group create --name <group-name> --location "East US"
$outputs = $(az deployment group create --name ExampleDeployment --resource-group <group-name> --template-file "./prereq.azuredeploy.json" --parameters objectId=$id --query "[properties.outputs.keyVaultName.value, properties.outputs.userAssignedIdentityPrincipalId.value, properties.outputs.userIdentityResourceId.value]" --output tsv)
az deployment group create --name ExampleDeployment --resource-group <group-name> --template-file "./azuredeploy.json" --parameters keyVaultName="$($outputs[0])" userAssignedIdentityPrincipalId="$($outputs[1])" userAssignedIdentityResourceId="$($outputs[2])" allowedOrigins="['http://localhost']" allowedRegions="['eastus', 'westus2', 'westcentralus']" maxRatePerSecond="10"
$secretId = $(az keyvault secret list --vault-name $outputs[0] --query "[? contains(name,'map')].id" --output tsv)
$sasToken = $(az keyvault secret show --id "$secretId" --query "value" --output tsv)
az rest --method GET --url 'https://us.atlas.microsoft.com/search/address/json?api-version=1.0&query=1 Microsoft Way, Redmond, WA 98052' --headers "Authorization=jwt-sas $($sasToken)" --query "results[].address"
Valós példa
Az Azure Maps API-khoz a legtöbb ügyféltől ( például C#, Java vagy JavaScript) irányuló kéréseket futtathat. Az OLYAN API-fejlesztési platformok, mint a Bruno vagy a Postman , szinte bármilyen választott programozási nyelven vagy keretrendszerben átalakíthatnak egy API-kérést egy alapszintű ügyfélkódrészletté. Használhatja a létrehozott kódrészleteket az előtérbeli alkalmazásokban.
Az alábbi kis JavaScript-kód példája bemutatja, hogyan használhatja SAS-jogkivonatát a JavaScript Fetch API-val az Azure Maps adatainak lekéréséhez és visszaadásához. A példa a Get Search Address API 1.0-s verzióját használja. Adja meg a saját értékét.<your SAS token>
Ahhoz, hogy ez a minta működjön, győződjön meg arról, hogy az API-hívás forrásától eltérő forrásból allowedOrigins
futtatja. Ha például az API-hívásban adja meg https://contoso.com
, allowedOrigins
a JavaScript-szkriptet futtató HTML-lapnak kell lennie https://contoso.com
.
async function getData(url = 'https://us.atlas.microsoft.com/search/address/json?api-version=1.0&query=1 Microsoft Way, Redmond, WA 98052') {
const response = await fetch(url, {
method: 'GET',
mode: 'cors',
headers: {
'Content-Type': 'application/json',
'Authorization': 'jwt-sas <your SAS token>',
}
});
return response.json(); // parses JSON response into native JavaScript objects
}
postData('https://us.atlas.microsoft.com/search/address/json?api-version=1.0&query=1 Microsoft Way, Redmond, WA 98052')
.then(data => {
console.log(data); // JSON data parsed by `data.json()` call
});
Az erőforrások eltávolítása
Ha már nincs szüksége az Azure-erőforrásokra, törölheti őket:
az group delete --name {group-name}
Következő lépések
Gyorsútmutató ARM-sablon üzembe helyezése SAS-jogkivonatot használó Azure Maps-fiók létrehozásához:
Részletesebb példákért lásd:
Az Azure Maps-fiók API-használati metrikáinak megkeresése:
Ismerje meg a Microsoft Entra ID és az Azure Maps integrálását bemutató példákat: