다음을 통해 공유


자습서: 로그인한 사용자를 대신하여 SQL Database에 App Service 앱 연결

이 자습서에서는 로그인한 사용자를 가장하여 Azure App Service 앱을 백 엔드 Azure SQL 데이터베이스 연결하는 방법을 보여줍니다. 이 흐름을 구성하려면 Microsoft Entra ID 공급자를 사용하여 App Service 기본 제공 인증 을 사용하도록 설정합니다.

이 연결 방법은 자습서의 관리 ID 접근 방식보다 고급입니다. 관리 ID를 사용하여 데이터에 액세스하고 엔터프라이즈 시나리오에서 다음과 같은 이점이 있습니다.

  • 관리 ID 접근 방식과 마찬가지로 백 엔드 서비스에 대한 연결 비밀을 제거합니다.
  • 백 엔드 데이터베이스 또는 다른 Azure 서비스에 부여할 액세스 권한을 더 자세히 제어할 수 있습니다.
  • 앱에서 로그인한 사용자에 맞게 데이터 표시를 조정할 수 있도록 합니다.

이 자습서에서는 Azure SQL Database 백 엔드가 있는 .NET 웹앱에 Microsoft Entra 인증을 추가합니다. 당신은 다음을 배우게 됩니다:

  • Azure SQL Database에 대해 Microsoft Entra 인증을 사용하도록 설정합니다.
  • 다른 SQL Database 인증 옵션을 사용하지 않도록 설정합니다.
  • 앱의 ID 공급자로 Microsoft Entra ID를 추가합니다.
  • SQL Database 사용자 가장 권한을 구성합니다.
  • SQL Database에 사용할 수 있는 액세스 토큰을 제공하도록 App Service를 구성합니다.
  • 로그인한 Microsoft Entra 사용자를 대신하여 Azure SQL 데이터베이스에 액세스합니다.

자습서를 완료하면 앱이 로그인한 사용자를 대신하여 SQL Database에 안전하게 연결됩니다.

자습서 시나리오를 위한 아키텍처 다이어그램.

참고 항목

  • Microsoft Entra ID는 온-프레미스 SQL Server에 대해 지원되지 않습니다.
  • Microsoft Entra 인증은 온-프레미스 AD(Active Directory) DS(Domain Services)의 Windows 통합 인증 과 다릅니다. AD DS 및 Microsoft Entra ID는 완전히 다른 인증 프로토콜을 사용합니다. 자세한 내용은 Microsoft Entra Domain Services 설명서를 참조하세요.

필수 조건

  • 사용자 및 그룹으로 채워진 Microsoft Entra 테넌트에 액세스할 수 있습니다.

  • 자습서: Azure App Service에서 ASP.NET Core 및 SQL Database 앱을 빌드하고 이 자습서에 완료된 앱을 사용합니다.

    또는 단계를 조정하고 SQL Database에서 고유한 .NET 앱을 사용합니다. 이 자습서의 단계에서는 다음 .NET 버전을 지원합니다.

    • .NET Framework 4.8 이상
    • .NET 6.0 이상
  • Azure Cloud Shell에 로그인하거나 Azure CLI를 사용하도록 환경을 준비합니다.

1. Microsoft Entra 인증을 사용하여 데이터베이스 서버 구성

Microsoft Entra 사용자를 Azure SQL Server의 관리자로 할당하여 Azure SQL 데이터베이스에 대한 Microsoft Entra 인증을 사용하도록 설정합니다. Microsoft Entra 관리자는 Microsoft Entra ID로 생성, 가져오기, 동기화 또는 초대된 사용자여야 합니다. Microsoft Entra 사용자는 Azure 구독에 대한 Microsoft 계정 사용자와 동일하지 않을 수 있습니다.

Microsoft Entra ID 사용자를 Azure SQL Server의 관리자로 추가하려면 다음 Azure CLI 명령을 실행합니다.

  1. 또는 upnfilter매개 변수와 함께 display-name사용하여 az ad user list 관리자로 만들려는 Microsoft Entra ID 사용자의 개체 ID를 가져옵니다. 예를 들어 다음 명령은 Firstname Lastname을 사용하는 Microsoft Entra ID 사용자에 display-name 대한 정보를 나열합니다.

    az ad user list --display-name "Firstname Lastname"
    

    id 다음 단계에서 사용할 출력의 값을 복사합니다.

    독립 실행형을 실행 az ad user list 하여 Microsoft Entra 디렉터리의 모든 사용자에 대한 정보를 표시할 수 있습니다.

  2. 매개 변수를 사용하여 az sql server ad-admin createobject-id Azure SQL Server에서 Microsoft Entra ID 사용자를 관리자로 추가합니다. 다음 명령에서 서버의 리소스 그룹 이름으로 바꾸고, <server-name> 서버 이름에서 접미사를 뺀 .database.windows.net 값으로 바꾸고, <entra-id> 이전 az ad user list 명령의 출력으로 id 바꿉 <group-name> 니다.

    az sql server ad-admin create --resource-group <group-name> --server-name <server-name> --display-name ADMIN --object-id <entra-id>
    
  3. 데이터베이스 서버 인증을 Microsoft Entra 인증으로만 제한합니다. 이 단계에서는 SQL 사용자 이름 및 암호 인증을 사용하지 않도록 설정합니다.

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

2. 앱에 Microsoft Entra ID 인증 사용

앱의 ID 공급자로 Microsoft Entra ID를 추가합니다. 자세한 내용은 App Services 애플리케이션에 대해 Microsoft Entra 인증 구성을 참조하세요.

  1. 앱의 Azure Portal 페이지에서 왼쪽 탐색 메뉴의 설정 아래에서 인증을 선택합니다.

  2. 인증 페이지에서 ID 공급자 추가를 선택하거나 ID 공급자 섹션에서 공급자 추가를 선택합니다.

  3. ID 공급자 추가 페이지에서 공급자로 Microsoft를 선택합니다.

  4. 클라이언트 비밀 만료의 경우 권장: 180일과 같은 드롭다운 목록 옵션 중 하나를 선택합니다.

  5. 모든 기본 설정을 유지하고 추가를 선택합니다.

    ID 공급자 추가 페이지를 보여 주는 스크린샷.

참고 항목

앱의 인증 설정을 다시 구성하는 경우 토큰 저장소의 토큰이 새 설정에서 다시 생성되지 않을 수 있습니다. 토큰이 다시 생성되도록 하려면 로그아웃하고 앱에 다시 로그인합니다. 쉬운 방법은 개인 모드에서 브라우저를 사용하는 것입니다. 앱에서 설정을 변경한 후 브라우저를 닫고 프라이빗 모드로 다시 엽니다.

3. SQL Database 사용자 가장 구성

로그인한 Microsoft Entra 사용자를 대신하여 SQL Database에 액세스할 수 있는 권한을 앱에 부여합니다.

  1. 앱의 인증 페이지에서 ID 공급자 아래에서 앱 이름을 선택합니다.

    앱 등록 페이지가 열립니다. 이 등록은 Microsoft Entra 공급자를 추가할 때 자동으로 생성됩니다.

  2. 왼쪽 탐색 메뉴의 관리에서 API 권한을 선택합니다.

  3. API 권한 페이지에서 권한 추가를 선택합니다.

  4. 요청 API 권한 화면에서 조직에서 사용하는 API 탭을 선택합니다.

  5. 검색 상자에 Azure SQL Database 를 입력하고 결과를 선택합니다.

  6. 애플리케이션에 필요한 사용 권한 유형 아래에서 위임된 권한을 선택한 다음, user_impersonation 옆의 확인란을 선택한 다음, 권한 추가를 선택합니다.

    위임된 권한, user_impersonation 및 선택한 권한 추가 단추를 보여 주는 API 권한 요청 페이지의 스크린샷

이제 Microsoft Entra의 앱 등록에는 로그인한 사용자를 가장하여 SQL Database에 연결하는 데 필요한 권한이 있습니다.

4. 사용 가능한 액세스 토큰을 반환하도록 App Service 구성

SQL Database에 사용할 수 있는 액세스 토큰을 제공하도록 앱을 구성하려면 앱의 Microsoft Entra 공급자loginParametersscope 추가 https://database.windows.net/user_impersonation 합니다. 다음 명령은 사용자 지정 범위가 loginParameters 있는 속성을 Microsoft Entra ID 공급자 login 설정에 추가합니다.

요청된 범위 중 App Service는 openidprofile기본적으로 이미 요청 및 email 범위를 요청합니다. 토큰을 offline_access 새로 고칠 수 있도록 범위가 포함됩니다. 자세한 내용은 OpenID Connect 범위를 참조하세요.

범위는 https://database.windows.net/user_impersonation Azure SQL Database를 참조하고 SQL Database를 토큰 수신자로 지정하는 JWT(JSON 웹 토큰) 를 제공합니다. 이 명령은 Cloud Shell에 이미 설치된 JSON 처리에 사용합니다 jq .

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"

Azure CLI 대신 웹 인터페이스를 사용하여 필요한 범위를 구성하려면 Microsoft Entra 공급자를 구성하여 새로 고침 토큰을 제공하고 요청된 범위에 추가 https://database.windows.net/user_impersonation 합니다.

이제 앱이 SQL Database에서 허용하는 액세스 토큰을 생성하도록 구성되었습니다.

참고 항목

액세스 토큰은 일정 시간 후에 만료됩니다. 사용자가 앱으로 다시 인증할 필요 없이 액세스 토큰을 새로 고치는 방법에 대한 자세한 내용은 인증 토큰 새로 고침을 참조하세요.

5. 애플리케이션 코드에서 액세스 토큰 사용

App Service 인증에서 제공하는 액세스 토큰을 연결 개체에 추가하도록 애플리케이션 코드를 업데이트합니다.

참고 항목

이 코드는 로컬에서 작동하지 않습니다. 로컬 디버깅에 대한 자세한 내용 및 대안은 App Service 인증을 사용할 때 로컬로 디버그를 참조하세요.

  1. DbContext 데이터베이스 컨텍스트를 구성하는 DatabaseContext.cs 또는 다른 파일의 개체에서 기본 생성자를 변경하여 Microsoft Entra ID 액세스 토큰을 연결 개체에 추가합니다.

    public MyDatabaseContext (DbContextOptions<MyDatabaseContext> options, IHttpContextAccessor accessor)
        : base(options)
    {
        var conn = Database.GetDbConnection() as SqlConnection;
        conn.AccessToken = accessor.HttpContext.Request.Headers["X-MS-TOKEN-AAD-ACCESS-TOKEN"];
    }
    
  2. 사용자 이름 및 암호로 SQL 인증을 사용하는 App Service에서 호출 defaultConnection 된 연결 문자열이 있는 경우 다음 명령을 사용하여 연결 비밀을 제거합니다. <group-name>, <app-name><db-server-name><db-name> 값을 대체합니다.

    az webapp config connection-string set --resource-group <group-name> --name <app-name> --connection-string-type SQLAzure --settings defaultConnection="server=tcp:<db-server-name>.database.windows.net;database=<db-name>;"
    

6. 변경 내용 게시

브라우저에서 Visual Studio Code를 사용하여 GitHub 포크에서 코드를 변경한 경우 왼쪽 메뉴에서 소스 제어 를 선택합니다. 커밋 메시지(예: OBO connect 커밋)를 입력하고 커밋을 선택합니다.

커밋은 App Service에 GitHub Actions 배포를 트리거합니다. 배포가 완료될 때까지 몇 분 정도 기다립니다.

다음 명령을 사용하여 Git Bash에서 변경 내용을 게시할 수도 있습니다.

git commit -am "configure managed identity"
git push azure main

코드가 Visual Studio에 있는 경우:

  1. 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 게시를 선택합니다.

    Visual Studio의 솔루션 탐색기에서 게시하는 방법을 보여 주는 스크린샷.

  2. 게시 페이지에서 게시를 선택합니다.

새 앱 페이지에 앱이 표시되면 앱이 로그인한 Microsoft Entra 사용자를 대신하여 Azure SQL 데이터베이스에 연결됩니다. 앱을 평소처럼 사용하고 편집할 수 있어야 합니다.

게시 후 웹앱을 보여 주는 스크린샷.

7. 리소스 정리

이전 단계에서는 리소스 그룹에서 Azure 리소스를 만들었습니다. 이러한 리소스가 더 이상 필요하지 않은 경우 다음 명령을 실행하여 리소스 그룹을 삭제합니다.

az group delete --name <group-name>

이 명령을 실행하는 데 다소 시간이 걸릴 수 있습니다.

자주 묻는 질문

"사용자 '토큰 식별 보안 주체>'<에 대한 로그인 실패" 오류가 표시되는 이유는 무엇인가요?

오류의 가장 일반적인 원인 Login failed for user '<token-identified principal>' 은 다음과 같습니다.

Azure SQL Database에서 다른 Microsoft Entra 사용자 또는 그룹을 추가하려면 어떻게 해야 하나요?

더 많은 사용자 또는 그룹을 추가하려면 sqlcmd 또는 SSMS(SQL Server Management Studio)를 사용하여 데이터베이스 서버에 연결하고 Microsoft Entra ID에 매핑 된 포함된 데이터베이스 사용자를 만듭니다.

다음 Transact-SQL 예제에서는 MICROSOFT Entra ID를 SQL Server에 추가하고 ID에 일부 데이터베이스 역할을 제공합니다.

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

App Service 인증을 사용할 때 로컬로 디버그하려면 어떻게 하나요?

App Service 인증은 Azure 기능이므로 이 자습서의 코드는 로컬 환경에서 작동하지 않습니다. Azure에서 실행되는 앱과 달리 로컬 코드는 App Service 인증 미들웨어의 이점을 활용하지 않습니다. 로컬 디버깅에 다음 대안을 사용할 수 있습니다.

  • 인증을 사용하여 로컬 환경에서 SQL Database에 Active Directory Interactive 연결합니다. 이 인증 흐름은 사용자 자체에 로그인하지 않지만 로그인한 사용자를 사용하여 백 엔드 데이터베이스에 연결하므로 로컬에서 데이터베이스 권한 부여를 테스트할 수 있습니다.
  • 요청 헤더 대신 X-MS-TOKEN-AAD-ACCESS-TOKEN 액세스 토큰을 코드에 수동으로 복사합니다.
  • Visual Studio에서 배포하는 경우 App Service 앱의 원격 디버깅을 사용합니다.

액세스 토큰이 만료되면 어떻게 되나요?

액세스 토큰은 일정 시간 후에 만료됩니다. 사용자에게 앱 재인증을 요구하지 않고 액세스 토큰을 새로 고치는 방법은 ID 공급자 토큰 새로 고침을 참조하세요.