Samouczek: Połączenie aplikacji usługi App Service do usługi SQL Database w imieniu zalogowanego użytkownika

W tym samouczku pokazano, jak włączyć wbudowane uwierzytelnianie w aplikacji usługi App Service przy użyciu dostawcy uwierzytelniania Entra firmy Microsoft, a następnie rozszerzyć go, łącząc ją z bazą danych Azure SQL Database zaplecza, personifikując zalogowanego użytkownika (znanego również jako przepływ w imieniu). Jest to bardziej zaawansowane podejście do łączności z samouczkiem: uzyskiwanie dostępu do danych przy użyciu tożsamości zarządzanej i ma następujące zalety w scenariuszach przedsiębiorstwa:

  • Eliminuje wpisy tajne połączeń z usługami zaplecza, podobnie jak w przypadku podejścia do tożsamości zarządzanej.
  • Zapewnia bazę danych zaplecza (lub inną usługę platformy Azure) większą kontrolę nad tym, kto lub ile ma udzielić dostępu do danych i funkcji.
  • Umożliwia aplikacji dostosowanie prezentacji danych do zalogowanego użytkownika.

W tym samouczku dodasz uwierzytelnianie microsoft Entra do przykładowej aplikacji internetowej wdrożonej w jednym z następujących samouczków:

Po zakończeniu aplikacja przykładowa będzie bezpiecznie uwierzytelniać użytkowników łączących się z usługą SQL Database w imieniu zalogowanego użytkownika.

Architecture diagram for tutorial scenario.

Uwaga

Kroki opisane w tym samouczku obsługują następujące wersje:

  • .NET Framework 4.8 i nowsze
  • .NET 6.0 i nowsze

Czego nauczysz się:

  • Włączanie wbudowanego uwierzytelniania dla usługi Azure SQL Database
  • Wyłączanie innych opcji uwierzytelniania w usłudze Azure SQL Database
  • Włączanie uwierzytelniania usługi App Service
  • Używanie identyfikatora Entra firmy Microsoft jako dostawcy tożsamości
  • Uzyskiwanie dostępu do usługi Azure SQL Database w imieniu zalogowanego użytkownika firmy Microsoft Entra

Uwaga

Uwierzytelnianie entra firmy Microsoft różni się od zintegrowanego uwierzytelniania systemu Windows w usłudze lokalna usługa Active Directory (AD DS). Usługi AD DS i Microsoft Entra ID używają zupełnie różnych protokołów uwierzytelniania. Aby uzyskać więcej informacji, zobacz dokumentację usług Microsoft Entra Domain Services.

Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto platformy Azure.

Wymagania wstępne

Ten artykuł będzie kontynuowany w miejscu, w którym zostało to przerwane w jednym z następujących samouczków:

Jeśli jeszcze tego nie zrobiono, najpierw wykonaj jedną z dwóch samouczków. Alternatywnie możesz dostosować kroki dla własnej aplikacji .NET za pomocą usługi SQL Database.

Przygotowanie środowiska do interfejsu wiersza polecenia platformy Azure.

Na platforma Azure hostowane jest Azure Cloud Shell, interaktywne środowisko powłoki, z którego można korzystać w przeglądarce. Do pracy z usługami platformy Azure można używać programu Bash lub PowerShell w środowisku Cloud Shell. Aby uruchomić kod w tym artykule, możesz użyć wstępnie zainstalowanych poleceń usługi Cloud Shell bez konieczności instalowania niczego w środowisku lokalnym.

Aby uruchomić środowisko Azure Cloud Shell:

Opcja Przykład/link
Wybierz pozycję Wypróbuj w prawym górnym rogu bloku kodu lub polecenia. Wybranie pozycji Wypróbuj nie powoduje automatycznego skopiowania kodu lub polecenia do usługi Cloud Shell. Screenshot that shows an example of Try It for Azure Cloud Shell.
Przejdź do witryny https://shell.azure.com lub wybierz przycisk Uruchom Cloud Shell, aby otworzyć środowisko Cloud Shell w przeglądarce. Button to launch Azure Cloud Shell.
Wybierz przycisk Cloud Shell na pasku menu w prawym górnym rogu witryny Azure Portal. Screenshot that shows the Cloud Shell button in the Azure portal

Aby użyć usługi Azure Cloud Shell:

  1. Uruchom usługę Cloud Shell.

  2. Wybierz przycisk Kopiuj w bloku kodu (lub bloku poleceń), aby skopiować kod lub polecenie.

  3. Wklej kod lub polecenie do sesji usługi Cloud Shell, wybierając klawisze Ctrl+Shift V w systemach Windows i Linux lub wybierając pozycję Cmd+Shift++V w systemie macOS.

  4. Wybierz klawisz Enter, aby uruchomić kod lub polecenie.

1. Konfigurowanie serwera bazy danych przy użyciu uwierzytelniania firmy Microsoft

Najpierw włącz uwierzytelnianie microsoft Entra w usłudze SQL Database, przypisując użytkownika Microsoft Entra jako administratora serwera. Ten użytkownik różni się od konta Microsoft użytego do zarejestrowania się w celu uzyskania subskrypcji platformy Azure. Musi to być użytkownik, który został utworzony, zaimportowany, zsynchronizowany lub zaproszony do usługi Microsoft Entra ID. Aby uzyskać więcej informacji na temat dozwolonych użytkowników microsoft Entra, zobacz Microsoft Entra features and limitations in SQL Database (Funkcje i ograniczenia firmy Microsoft w usłudze SQL Database).

  1. Jeśli dzierżawa firmy Microsoft Entra nie ma jeszcze użytkownika, utwórz go, wykonując kroki opisane w temacie Dodawanie lub usuwanie użytkowników przy użyciu identyfikatora Entra firmy Microsoft.

  2. Znajdź identyfikator obiektu użytkownika Microsoft Entra przy użyciu i zastąp az ad user list wartość <user-principal-name>. Wynik jest zapisywany w zmiennej.

    azureaduser=$(az ad user list --filter "userPrincipalName eq '<user-principal-name>'" --query [].id --output tsv)
    

    Napiwek

    Aby wyświetlić listę wszystkich głównych nazw użytkowników w identyfikatorze Entra firmy Microsoft, uruchom polecenie az ad user list --query [].userPrincipalName.

  3. Dodaj tego użytkownika microsoft Entra jako administratora usługi Active Directory przy użyciu az sql server ad-admin create polecenia w usłudze Cloud Shell. W poniższym poleceniu zastąp <ciąg server-name> nazwą serwera (bez sufiksu.database.windows.net).

    az sql server ad-admin create --resource-group <group-name> --server-name <server-name> --display-name ADMIN --object-id $azureaduser
    
  4. Ogranicz uwierzytelnianie serwera bazy danych do uwierzytelniania usługi Active Directory. Ten krok skutecznie wyłącza uwierzytelnianie SQL.

    az sql server ad-only-auth enable --resource-group <group-name> --server-name <server-name>
    

Aby uzyskać więcej informacji na temat dodawania administratora usługi Active Directory, zobacz Aprowizuj administratora usługi Microsoft Entra (SQL Database).

2. Włączanie uwierzytelniania użytkowników dla aplikacji

Uwierzytelnianie można włączyć za pomocą identyfikatora Entra firmy Microsoft jako dostawcy tożsamości. Aby uzyskać więcej informacji, zobacz Configure Microsoft Entra authentication for your App Services application (Konfigurowanie uwierzytelniania entra firmy Microsoft dla aplikacji usługi App Services).

  1. W menu witryny Azure Portal wybierz pozycję Grupy zasobów lub wyszukaj i wybierz pozycję Grupy zasobów na dowolnej stronie.

  2. W obszarze Grupy zasobów znajdź i wybierz grupę zasobów, a następnie wybierz aplikację.

  3. W menu po lewej stronie aplikacji wybierz pozycję Uwierzytelnianie, a następnie wybierz pozycję Dodaj dostawcę tożsamości.

  4. Na stronie Dodawanie dostawcy tożsamości wybierz pozycję Microsoft jako dostawcę tożsamości, aby zalogować się do tożsamości firmy Microsoft i tożsamości firmy Microsoft.

  5. Zaakceptuj ustawienia domyślne i wybierz pozycję Dodaj.

    Screenshot showing the add identity provider page.

Napiwek

Jeśli wystąpią błędy i ponownie skonfigurujesz ustawienia uwierzytelniania aplikacji, tokeny w magazynie tokenów mogą nie zostać ponownie wygenerowane z nowych ustawień. Aby mieć pewność, że tokeny zostaną ponownie wygenerowane, musisz wylogować się z aplikacji i zalogować się do niej ponownie. Łatwo to zrobić, korzystając z przeglądarki w trybie prywatnym. Po zmianie ustawień w aplikacjach zamknij przeglądarkę i otwórz ją ponownie w trybie prywatnym.

3. Konfigurowanie personifikacji użytkownika w usłudze SQL Database

Obecnie aplikacja platformy Azure łączy się z usługą SQL Database przy użyciu uwierzytelniania SQL (nazwy użytkownika i hasła) zarządzanego jako ustawienia aplikacji. W tym kroku przyznasz aplikacji uprawnienia dostępu do usługi SQL Database w imieniu zalogowanego użytkownika firmy Microsoft Entra.

  1. Na stronie Uwierzytelnianie aplikacji wybierz nazwę aplikacji w obszarze Dostawca tożsamości. Ta rejestracja aplikacji została wygenerowana automatycznie. Wybierz pozycję Uprawnienia interfejsu API w menu po lewej stronie.

  2. Wybierz pozycję Dodaj uprawnienie, a następnie wybierz pozycję Interfejsy API używane przez moją organizację.

  3. Wpisz azure SQL Database w polu wyszukiwania i wybierz wynik.

  4. Na stronie Żądanie uprawnień interfejsu API dla usługi Azure SQL Database wybierz pozycję Delegowane uprawnienia i user_impersonation, a następnie wybierz pozycję Dodaj uprawnienia.

    Screenshot of the Request API permissions page showing Delegated permissions, user_impersonation, and the Add permission button selected.

4. Konfigurowanie usługi App Service w celu zwrócenia tokenu dostępu do użytku

Rejestracja aplikacji w identyfikatorze Entra firmy Microsoft ma teraz wymagane uprawnienia do nawiązywania połączenia z usługą SQL Database przez personifikację zalogowanego użytkownika. Następnie skonfigurujesz aplikację usługi App Service, aby zapewnić dostęp do użycia token.

W usłudze Cloud Shell uruchom następujące polecenia w aplikacji, aby dodać scope parametr do ustawienia identityProviders.azureActiveDirectory.login.loginParametersuwierzytelniania .

authSettings=$(az webapp auth show --resource-group <group-name> --name <app-name>)
authSettings=$(echo "$authSettings" | jq '.properties' | jq '.identityProviders.azureActiveDirectory.login += {"loginParameters":["scope=openid profile email offline_access https://database.windows.net/user_impersonation"]}')
az webapp auth set --resource-group <group-name> --name <app-name> --body "$authSettings"

Polecenia skutecznie dodają loginParameters właściwość z dodatkowymi zakresami niestandardowymi. Oto wyjaśnienie żądanych zakresów:

  • openid, profilei email są już domyślnie żądane przez usługę App Service. Aby uzyskać informacje, zobacz OpenID Połączenie Zakresy.
  • https://database.windows.net/user_impersonation odnosi się do usługi Azure SQL Database. Jest to zakres, który zapewnia token JWT, który obejmuje usługę SQL Database jako odbiorców tokenów.
  • offline_access jest uwzględniona w tym miejscu dla wygody (na wypadek, gdy chcesz odświeżyć tokeny).

Napiwek

Aby zamiast tego skonfigurować wymagane zakresy przy użyciu interfejsu internetowego, zobacz kroki firmy Microsoft w temacie Odświeżanie tokenów uwierzytelniania.

Aplikacje są teraz skonfigurowane. Aplikacja może teraz wygenerować token akceptowany przez usługę SQL Database.

5. Użyj tokenu dostępu w kodzie aplikacji

Kroki, które należy wykonać dla projektu, zależą od tego, czy używasz programu Entity Framework (ustawienie domyślne dla ASP.NET) czy Entity Framework Core (ustawienie domyślne dla platformy ASP.NET Core).

  1. W programie Visual Studio otwórz konsolę Menedżer pakietów i zaktualizuj program Entity Framework:

    Update-Package EntityFramework
    
  2. W obiekcie DbContext (w obszarze Models/MyDbContext.cs) dodaj następujący kod do konstruktora domyślnego.

    var conn = (System.Data.SqlClient.SqlConnection)Database.Connection;
    conn.AccessToken = System.Web.HttpContext.Current.Request.Headers["X-MS-TOKEN-AAD-ACCESS-TOKEN"];
    

Uwaga

Kod dodaje token dostępu dostarczony przez uwierzytelnianie usługi App Service do obiektu połączenia.

Ta zmiana kodu nie działa lokalnie. Aby uzyskać więcej informacji, zobacz Jak mogę debugować lokalnie podczas korzystania z uwierzytelniania usługi App Service?.

6. Publikowanie zmian

  1. Jeśli pochodzisz z artykułu Samouczek: tworzenie aplikacji ASP.NET na platformie Azure przy użyciu usługi SQL Database, ustawisz parametry połączenia w usłudze App Service przy użyciu uwierzytelniania SQL z nazwą użytkownika i hasłem. Użyj następującego polecenia, aby usunąć wpisy tajne połączenia, ale zastąp ciąg group-name, <app-name>>,< db-server-name> i <db-name> twoimi.<

    az webapp config connection-string set --resource-group <group-name> --name <app-name> --connection-string-type SQLAzure --settings MyDbConnection="server=tcp:<db-server-name>.database.windows.net;database=<db-name>;"
    
  2. Opublikuj zmiany w programie Visual Studio. W obszarze Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt DotNetAppSqlDb i wybierz polecenie Publikuj.

    Screenshot showing how to publish from the Solution Explorer in Visual Studio.

  3. Na stronie publikowania wybierz pozycję Publikuj.

Gdy nowa strona internetowa wyświetli listę zadań do wykonania, aplikacja łączy się z bazą danych w imieniu zalogowanego użytkownika Microsoft Entra.

Azure app after Code First Migration

Teraz powinno być możliwe edytowanie listy zadań do wykonania tak jak wcześniej.

7. Czyszczenie zasobów

W poprzednich krokach utworzono zasoby platformy Azure w grupie zasobów. Jeśli te zasoby nie będą raczej potrzebne w przyszłości, usuń grupę zasobów, uruchamiając następujące polecenie w usłudze Cloud Shell:

az group delete --name <group-name>

Wykonanie tego polecenia może potrwać około minutę.

Często zadawane pytania

Dlaczego występuje Login failed for user '<token-identified principal>'. błąd?

Najczęstsze przyczyny tego błędu to:

Jak mogę dodać innych użytkowników lub grup firmy Microsoft w usłudze Azure SQL Database?

  1. Połączenie na serwer bazy danych, taki jak sqlcmd lub SSMS.

  2. Tworzenie zawartych użytkowników mapowanych na tożsamości firmy Microsoft w dokumentacji usługi SQL Database.

    Poniższy przykład języka Transact-SQL dodaje tożsamość firmy Microsoft Entra do programu SQL Server i udostępnia mu kilka ról bazy danych:

    CREATE USER [<user-or-group-name>] FROM EXTERNAL PROVIDER;
    ALTER ROLE db_datareader ADD MEMBER [<user-or-group-name>];
    ALTER ROLE db_datawriter ADD MEMBER [<user-or-group-name>];
    ALTER ROLE db_ddladmin ADD MEMBER [<user-or-group-name>];
    GO
    

Jak mogę debugować lokalnie podczas korzystania z uwierzytelniania usługi App Service?

Ponieważ uwierzytelnianie usługi App Service jest funkcją na platformie Azure, nie jest możliwe, aby ten sam kod działał w środowisku lokalnym. W przeciwieństwie do aplikacji działającej na platformie Azure kod lokalny nie korzysta z oprogramowania pośredniczącego uwierzytelniania z usługi App Service. Masz kilka alternatyw:

  • Połączenie do usługi SQL Database ze środowiska lokalnego za pomocą polecenia Active Directory Interactive. Przepływ uwierzytelniania nie loguje użytkownika do samej aplikacji, ale łączy się z bazą danych zaplecza przy użyciu zalogowanego użytkownika i umożliwia testowanie autoryzacji bazy danych lokalnie.
  • Ręcznie skopiuj token dostępu z https://<app-name>.azurewebsites.net/.auth/me do kodu zamiast nagłówka X-MS-TOKEN-AAD-ACCESS-TOKEN żądania.
  • W przypadku wdrażania z poziomu programu Visual Studio użyj zdalnego debugowania aplikacji usługi App Service.

Co się stanie po wygaśnięciu tokenów dostępu?

Token dostępu wygasa po pewnym czasie. Aby uzyskać informacje na temat odświeżania tokenów dostępu bez konieczności ponownego uwierzytelniania użytkowników w aplikacji, zobacz Odświeżanie tokenów dostawców tożsamości.

Następne kroki

Które czynności umiesz wykonać:

  • Włączanie wbudowanego uwierzytelniania dla usługi Azure SQL Database
  • Wyłączanie innych opcji uwierzytelniania w usłudze Azure SQL Database
  • Włączanie uwierzytelniania usługi App Service
  • Używanie identyfikatora Entra firmy Microsoft jako dostawcy tożsamości
  • Uzyskiwanie dostępu do usługi Azure SQL Database w imieniu zalogowanego użytkownika firmy Microsoft Entra