Freigeben über


Authentifizieren bei Cosmos DB in Microsoft Fabric aus Fabric-Notizbüchern

Cosmos DB in Microsoft Fabric basiert ausschließlich auf der Microsoft Entra ID-Authentifizierung und integrierten Datenebenenrollen zum Verwalten von Authentifizierung und Autorisierung. In diesem Leitfaden verwenden Sie Die Microsoft Entra-ID und Ihr angemeldetes Konto, um eine Verbindung mit einem Cosmos DB-Artefakt in Microsoft Fabric herzustellen.

Voraussetzungen

  • Eine Identität mit der Leseberechtigung für die Datenbank in Fabric

Abrufen des Cosmos DB-Endpunkts

Rufen Sie zuerst den Endpunkt für die Cosmos DB-Datenbank in Fabric ab. Dieser Endpunkt ist erforderlich, um eine Verbindung mit dem Azure SDK herzustellen.

  1. Öffnen Sie das Fabric-Portal (https://app.fabric.microsoft.com).

  2. Navigieren Sie zu Ihrer vorhandenen Cosmos DB-Datenbank.

  3. Wählen Sie die Einstellungsoption in der Menüleiste für die Datenbank aus.

    Screenshot der Menüleistenoption

  4. Navigieren Sie im Dialogfeld "Einstellungen" zum Abschnitt "Verbindung" . Kopieren Sie dann den Wert des Endpoints für die Cosmos DB NoSQL-Datenbank. Sie verwenden diesen Wert in einem späteren Schritt[s].

    Screenshot des Abschnitts

Authentifizieren aus einem Notizbuch

Fabric-Notizbücher haben keine Möglichkeit, ein gültiges Azure-Anmeldeinformationsobjekt zu erstellen, das von Azure-Diensten verwendet wird. Benutzer authentifizieren sich mithilfe von Fabric NotebookUtils-Anmeldeinformationsprogrammen , die den Authentifizierungsbereich für Cosmos DB erfordern und ein Token im Zeichenfolgenformat erzeugen. Dazu ist ein benutzerdefinierter Code erforderlich, um ein gültiges Azure-Anmeldeinformationsobjekt zu erstellen.

Hier ist ein Notizbuchbeispiel, in dem dies veranschaulicht wird.

Zelle [1]:

#Install packages
%pip install azure-cosmos

Zelle [2]:

#Imports and config values
import logging

from azure.cosmos.aio import CosmosClient
from azure.cosmos.exceptions import CosmosHttpResponseError

COSMOS_ENDPOINT = 'https://my-cosmos-endpoint.cosmos.fabric.microsoft.com:443/'
COSMOS_DATABASE_NAME = '{your-cosmos-artifact-name}'
COSMOS_CONTAINER_NAME = '{your-container-name}'

Der Inhalt von Zelle 3 erstellt ein FabricTokenCredential()-Objekt und enthält den Code, der erforderlich ist, um ein gültiges Anmeldeinformationsobjekt für das Cosmos DB SDK aus der Tokenzeichenfolge zu erzeugen, die von den Fabric NotebookUtils-Anmeldeinformationsprogrammen generiert wird, die zum Authentifizieren eines Benutzers erforderlich sind.

Zelle [3]:

# Custom TokenCredential implementation for Fabric authentication in a notebook
%pip install azure-core
from azure.core.credentials import TokenCredential, AccessToken
import base64
import json
import notebookutils
from datetime import datetime, timezone

class FabricTokenCredential(TokenCredential):

    def get_token(self, *scopes: str, claims: Optional[str] = None, tenant_id: Optional[str] = None,
                  enable_cae: bool = False, **kwargs: Any) -> AccessToken:
        access_token = notebookutils.credentials.getToken("https://cosmos.azure.com/")
        parts = access_token.split(".")
        if len(parts) < 2:
            raise ValueError("Invalid JWT format")
        payload_b64 = parts[1]
        # Fix padding
        padding = (-len(payload_b64)) % 4
        if padding:
            payload_b64 += "=" * padding
        payload_json = base64.urlsafe_b64decode(payload_b64.encode("utf-8")).decode("utf-8")
        payload = json.loads(payload_json)
        exp = payload.get("exp")
        if exp is None:
            raise ValueError("exp claim missing in token")
        return AccessToken(token=access_token, expires_on=exp) 

Zelle [4]:

# Create a Cosmos client with the FabricTokenCredential() and run a query
async with CosmosClient(endpoint, credential=FabricTokenCredential()) as client:
    container = client.get_database_client(COSMOS_DATABASE_NAME).get_container_client(COSMOS_CONTAINER_NAME)

    query_text = "SELECT * FROM c"

    results = container.query_items(query=query_text)

    items = []
    async for item in results:
        items.append(item)

    for item in items:
        print(item)