Använda Azure AI Search utan nycklar

I programkoden kan du konfigurera en nyckellös anslutning till Azure AI Search som använder Microsoft Entra-ID och roller för autentisering och auktorisering. Programbegäranden till de flesta Azure-tjänster måste autentiseras med nycklar eller nyckellösa anslutningar. Utvecklare måste vara noggranna för att aldrig exponera nycklarna på en osäker plats. Alla som får åtkomst till nyckeln kan autentisera till tjänsten. Nyckellös autentisering ger bättre hanterings- och säkerhetsfördelar jämfört med kontonyckeln eftersom det inte finns någon nyckel (eller niska veze) att lagra.

Nyckellösa anslutningar aktiveras med följande steg:

  • Konfigurera din autentisering.
  • Ange miljövariabler efter behov.
  • Använd en autentiseringstyp för Azure Identity-biblioteket för att skapa ett Azure AI Search-klientobjekt.

Förutsättningar

Följande steg måste slutföras för både lokala utvecklings- och produktionsarbetsbelastningar:

Skapa en AI Search-resurs

Innan du fortsätter med den här artikeln behöver du en Azure AI Search-resurs att arbeta med. Om du inte har någon resurs skapar du resursen nu. Aktivera rollbaserad åtkomstkontroll (RBAC) för resursen.

Installera Azure Identity-klientbiblioteket

Innan du arbetar lokalt utan nyckellös bör du uppdatera din AI Search-aktiverade kod med Azure Identity-klientbiblioteket.

Installera Azure Identity-klientbiblioteket för .NET:

dotnet add package Azure.Identity

Uppdatera källkoden för att använda DefaultAzureCredential

Med Azure Identity-biblioteket kan DefaultAzureCredential du köra samma kod i den lokala utvecklingsmiljön och i Azure-molnet. Skapa en enda autentiseringsuppgift och återanvänd autentiseringsuppgiftsinstansen efter behov för att dra nytta av tokencachelagring.

Mer information om DefaultAzureCredential för .NET finns i Azure Identity-klientbiblioteket för .NET.

using Azure;
using Azure.Search.Documents;
using Azure.Search.Documents.Indexes;
using Azure.Search.Documents.Indexes.Models;
using Azure.Search.Documents.Models;
using Azure.Identity;
using System;
using static System.Environment;

string endpoint = GetEnvironmentVariable("AZURE_SEARCH_ENDPOINT");
string indexName = "my-search-index";

DefaultAzureCredential credential = new();
SearchClient searchClient = new(new Uri(endpoint), indexName, credential);
SearchIndexClient searchIndexClient = new(endpoint, credential);

Lokal utveckling

Lokal utveckling utan nyckellös omfattar följande steg:

  • Tilldela din personliga identitet med RBAC-roller på den specifika resursen.
  • Använd ett verktyg för att autentisera med Azure.
  • Upprätta miljövariabler för resursen.

Roller för lokal utveckling

Som lokal utvecklare behöver din Azure-identitet fullständig kontroll över din tjänst. Den här kontrollen tillhandahålls med RBAC-roller. Det här är de föreslagna rollerna för att hantera din resurs under utvecklingen:

  • Söktjänstdeltagare
  • Search Index Data Contributor
  • Dataläsare för sökindex

Hitta din personliga identitet med något av följande verktyg. Använd den identiteten <identity-id> som värde.

  1. Logga in på Azure CLI.

    az login
    
  2. Hämta din personliga identitet.

    az ad signed-in-user show \
        --query id -o tsv
    
  3. Tilldela rollen rollbaserad åtkomstkontroll (RBAC) till resursgruppens identitet.

    az role assignment create \
        --role "<role-name>" \
        --assignee "<identity-id>" \
        --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>"
    

I förekommande fall ersätter <identity-id>du , <subscription-id>och <resource-group-name> med dina faktiska värden.

Autentisering för lokal utveckling

Använd ett verktyg i din lokala utvecklingsmiljö för autentisering till Azure-identitet. När du har autentiserats hittar och använder instansen DefaultAzureCredential i källkoden autentiseringen.

Konfigurera miljövariabler för lokal utveckling

Om du vill ansluta till Azure AI Search måste koden känna till resursslutpunkten.

Skapa en miljövariabel med namnet AZURE_SEARCH_ENDPOINT för din Azure AI Search-slutpunkt. Den här URL:en har vanligtvis formatet https://<YOUR-RESOURCE-NAME>.search.windows.net/.

Produktionsarbetsbelastningar

Distribuera produktionsarbetsbelastningar innehåller följande steg:

  • Välj RBAC-roller som följer principen om minsta behörighet.
  • Tilldela RBAC-roller till din produktionsidentitet på den specifika resursen.
  • Konfigurera miljövariabler för din resurs.

Roller för produktionsarbetsbelastningar

Om du vill skapa dina produktionsresurser måste du skapa en användartilldelad hanterad identitet och sedan tilldela den identiteten till dina resurser med rätt roller.

Följande roll föreslås för ett produktionsprogram:

Rollnamn Id
Dataläsare för sökindex 1407120a-92aa-4202-b7e9-c0e197c71c8f

Autentisering för produktionsarbetsbelastningar

Använd följande Azure AI Search Bicep-mall för att skapa resursen och ange autentiseringen identityIdför . Bicep kräver roll-ID: t. Det name som visas i det här Bicep-kodfragmentet är inte Azure-rollen. Det är specifikt för Bicep-distributionen.

// main.bicep
param environment string = 'production'
param roleGuid string = ''

module aiSearchRoleUser 'core/security/role.bicep' = {
    scope: aiSearchResourceGroup
    name: 'aiSearch-role-user'
    params: {
        principalId: (environment == 'development') ? principalId : userAssignedManagedIdentity.properties.principalId 
        principalType: (environment == 'development') ? 'User' : 'ServicePrincipal'
        roleDefinitionId: roleGuid
    }
}

Filen main.bicep anropar följande generiska Bicep-kod för att skapa valfri roll. Du har möjlighet att skapa flera RBAC-roller, till exempel en för användaren och en annan för produktion. På så sätt kan du aktivera både utvecklings- och produktionsmiljöer i samma Bicep-distribution.

// core/security/role.bicep
metadata description = 'Creates a role assignment for an identity.'
param principalId string // passed in from main.bicep

@allowed([
    'Device'
    'ForeignGroup'
    'Group'
    'ServicePrincipal'
    'User'
])
param principalType string = 'ServicePrincipal'
param roleDefinitionId string // Role ID

resource role 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
    name: guid(subscription().id, resourceGroup().id, principalId, roleDefinitionId)
    properties: {
        principalId: principalId
        principalType: principalType
        roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', roleDefinitionId)
    }
}

Konfigurera miljövariabler för produktionsarbetsbelastningar

För att ansluta till Azure AI Search måste koden känna till resursslutpunkten och ID:t för den hanterade identiteten.

Skapa miljövariabler för din distribuerade och nyckellösa Azure AI Search-resurs:

  • AZURE_SEARCH_ENDPOINT: Den här URL:en är åtkomstpunkten för din Azure AI Search-resurs. Den här URL:en har vanligtvis formatet https://<YOUR-RESOURCE-NAME>.search.windows.net/.
  • AZURE_CLIENT_ID: Det här är den identitet som ska autentiseras som.