다음을 통해 공유


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

이 자습서에서는 Microsoft Entra 인증 공급자를 사용하여 App Service 앱에서 기본 제공 인증을 사용하도록 설정한 다음, 로그인한 사용자(on-behalf-of 흐름이라고도 함)를 가장하여 백 엔드 Azure SQL Database에 연결하여 확장하는 방법을 보여 줍니다. 이것은 자습서: 관리 ID를 사용하여 데이터에 액세스에 대한 고급 연결 접근 방식이며 엔터프라이즈 시나리오에서 다음과 같은 이점이 있습니다.

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

이 자습서에서는 다음 자습서 중 하나에서 배포한 샘플 웹앱에 Microsoft Entra 인증을 추가합니다.

완료되면 샘플 앱은 사용자를 인증하여 로그인한 사용자를 대신하여 안전하게 SQL Database에 연결할 수 있도록 합니다.

자습서 시나리오에 대한 아키텍처 다이어그램

참고 항목

이 자습서에서 다루는 단계는 다음 버전을 지원합니다.

  • .NET Framework 4.8 이상
  • RHEL 6.0 이상

다음을 알아봅니다.

  • Azure SQL Database에 대해 기본 제공 인증 사용
  • Azure SQL Database에서 다른 인증 옵션 사용 안 함
  • App Service 인증을 사용하도록 설정
  • ID 공급자로 Microsoft Entra ID 사용
  • 로그인한 Microsoft Entra 사용자를 대신하여 Azure SQL Database에 액세스

참고 항목

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

Azure를 구독하고 있지 않다면 시작하기 전에 Azure 체험 계정을 만듭니다.

필수 조건

이 문서는 다음 자습서 중 하나에서 중단된 위치를 계속합니다.

아직 수행하지 않은 경우 두 자습서 중 하나를 먼저 수행합니다. 또는 SQL Database를 사용하여 해당 .NET 앱에 맞게 단계를 조정할 수 있습니다.

Azure CLI에 대한 환경을 준비합니다.

Azure는 브라우저를 통해 사용할 수 있는 대화형 셸 환경인 Azure Cloud Shell을 호스트합니다. Cloud Shell에서 Bash 또는 PowerShell을 사용하여 Azure 서비스 작업을 수행할 수 있습니다. 로컬 환경에 아무 것도 설치할 필요 없이 Azure Cloud Shell의 미리 설치된 명령을 사용하여 이 문서의 코드를 실행할 수 있습니다.

Azure Cloud Shell을 시작하려면 다음을 수행합니다.

옵션 예제/링크
코드 또는 명령 블록의 오른쪽 상단에서 시도를 선택합니다. 시도를 선택해도 코드 또는 명령이 Cloud Shell에 자동으로 복사되지 않습니다. Azure Cloud Shell에 대한 사용 예제를 보여 주는 스크린샷
https://shell.azure.com으로 이동하거나 Cloud Shell 시작 단추를 선택하여 브라우저에서 Cloud Shell을 엽니다. Azure Cloud Shell을 시작하는 단추입니다.
Azure Portal의 오른쪽 위에 있는 메뉴 모음에서 Cloud Shell 단추를 선택합니다. Azure Portal의 Cloud Shell 단추를 보여 주는 스크린샷

Azure Cloud Shell을 사용하려면:

  1. Cloud Shell을 시작합니다.

  2. 코드 블록(또는 명령 블록)에서 복사 단추를 선택하여 코드 또는 명령을 복사합니다.

  3. Windows 및 Linux에서 Ctrl+Shift+V를 선택하거나 macOS에서 Cmd+Shift+V를 선택하여 코드 또는 명령을 Cloud Shell 세션에 붙여넣습니다.

  4. Enter를 선택하여 코드 또는 명령을 실행합니다.

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

먼저 Microsoft Entra 사용자를 서버 관리자로 할당하여 SQL Database에 대한 Microsoft Entra 인증을 사용 설정합니다. 이 사용자는 Azure 구독에 가입하는 데 사용한 Microsoft 계정과 다릅니다. 직접 만들거나, Microsoft Entra ID로 가져오거나, 동기화하거나, 초대한 사용자여야 합니다. 허용되는 Microsoft Entra 사용자에 대한 자세한 내용은 SQL Database의 Microsoft Entra 기능 및 제한 사항을 참조하세요.

  1. Microsoft Entra 테넌트에 아직 사용자가 없는 경우 Microsoft Entra ID를 사용하여 사용자 추가 또는 삭제의 단계에 따라 하나를 만듭니다.

  2. az ad user list를 사용하여 Microsoft Entra 사용자의 개체 ID를 찾고 <user-principal-name>을 바꿉니다. 결과는 변수에 저장됩니다.

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

    Microsoft Entra ID의 모든 사용자 계정 이름 목록을 보려면 az ad user list --query [].userPrincipalName를 실행합니다.

  3. Cloud Shell에서 az sql server ad-admin create 명령을 사용하여 이 Microsoft Entra 사용자를 Active Directory 관리자로 추가합니다. 다음 명령에서 <server-name>.database.windows.net 접미사 없이 서버 이름으로 바꿉니다.

    az sql server ad-admin create --resource-group <group-name> --server-name <server-name> --display-name ADMIN --object-id $azureaduser
    
  4. 데이터베이스 서버 인증을 Active Directory 인증으로 제한합니다. 이 단계에서는 SQL 인증을 효과적으로 사용하지 않도록 설정합니다.

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

Active Directory 관리자를 추가하는 방법에 대한 자세한 내용은 Microsoft Entra 관리자 프로비전(SQL Database)을 참조하세요.

2. 앱에 대한 사용자 인증 사용

Microsoft Entra ID를 사용하여 ID 공급자로 인증하도록 설정합니다. 자세한 내용은 App Services 애플리케이션에 대해 Microsoft Entra 인증 구성을 참조하세요.

  1. Azure Portal 메뉴에서 리소스 그룹을 선택하거나 검색하여 어느 페이지에서든 리소스 그룹을 선택합니다.

  2. 리소스 그룹에서 리소스 그룹을 찾아 선택한 다음, 앱을 선택합니다.

  3. 앱의 왼쪽 메뉴에서 인증을 선택한 다음, ID 공급자 추가를 선택합니다.

  4. ID 공급자 추가 페이지에서 ID 공급자Microsoft를 선택하여 Microsoft 및 Microsoft Entra ID에 로그인합니다.

  5. 기본 설정을 적용하고 추가를 선택합니다.

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

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

3. SQL Database에 대한 사용자 가장 구성

현재 Azure 앱은 앱 설정으로 관리되는 SQL 인증(사용자 이름 및 암호)을 사용하여 SQL Database에 연결합니다. 이 단계에서는 로그인한 Microsoft Entra 사용자를 대신하여 SQL Database에 액세스할 수 있는 권한을 앱에 부여합니다.

  1. 앱의 인증 페이지에서 ID 공급자 아래의 앱 이름을 선택합니다. 이 앱 등록은 자동으로 생성되었습니다. 왼쪽 메뉴에서 API 권한을 선택합니다.

  2. 권한 추가를 선택한 다음, 내 조직에서 사용하는 API를 선택합니다.

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

  4. Azure SQL Database에 대한 API 권한 요청 페이지에서 위임된 권한user_impersonation를 선택한 다음, 권한 추가를 선택합니다.

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

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

이제 Microsoft Entra ID의 앱 등록에는 로그인한 사용자를 가장하여 SQL Database 연결하는 데 필요한 권한이 있습니다. 다음으로, 사용 가능한 액세스 토큰을 제공하도록 App Service 앱을 구성합니다.

Cloud Shell의 앱에서 다음 명령을 실행하여 scope 매개 변수를 identityProviders.azureActiveDirectory.login.loginParameters 인증 설정에 추가합니다. 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"

이 명령은 추가 사용자 지정 범위가 있는 loginParameters 속성을 효과적으로 추가합니다. 요청 범위에 대한 설명은 다음과 같습니다.

  • openid, profileemail은(는) 기본값으로 App Service에 의해 요청됩니다. 자세한 내용은 OpenID Connect 범위를 참조하세요.
  • https://database.windows.net/user_impersonation는 Azure SQL Database를 참조합니다. 토큰 대상 그룹으로 SQL Database를 포함하는 JWT 토큰을 제공하는 범위입니다.
  • 사용자 편의를 위해 여기에 offline_access를 포함합니다(토큰을 새로 고치는 경우).

대신 웹 인터페이스를 사용하여 필요한 범위를 구성하려면 인증 토큰 새로 고침의 Microsoft 단계를 참조하세요.

이제 앱이 구성되었습니다. 이제 앱은 SQL Database에서 허용하는 토큰을 생성할 수 있습니다.

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

프로젝트에 대해 수행하는 단계는 Entity Framework(ASP.NET 기본값) 또는 Entity Framework Core(ASP.NET Core 기본값)를 사용하는지 여부에 따라 달라집니다.

  1. Visual Studio에서 패키지 관리자 콘솔을 열고 Entity Framework를 업데이트합니다.

    Update-Package EntityFramework
    
  2. DbContext 개체(Models/MyDbContext.cs에 있음)에서 기본 생성자에 다음 코드를 추가합니다.

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

참고 항목

이 코드는 App Service 인증에서 제공하는 액세스 토큰을 연결 개체에 추가합니다.

이 코드 변경은 로컬에서 작동하지 않습니다. 자세한 내용은 App Service 인증을 사용할 때 로컬로 디버그하려면 어떻게 하나요?를 참조하세요.

6. 변경 내용 게시

  1. 자습서: SQL Database를 사용하여 Azure에서 ASP.NET 앱 빌드을 진행하고 있는 경우 SQL 인증을 사용하여 App Service에서 사용자 이름과 암호로 연결 문자열을 설정합니다. 다음 명령을 사용하여 연결 비밀을 제거하지만 <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 MyDbConnection="server=tcp:<db-server-name>.database.windows.net;database=<db-name>;"
    
  2. Visual Studio에서 변경 내용을 게시합니다. 솔루션 탐색기에서 DotNetAppSqlDb 프로젝트를 마우스 오른쪽 단추로 클릭하고 게시를 선택합니다.

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

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

새 웹 페이지에 할 일 목록이 표시되면 앱이 로그인한 Microsoft Entra 사용자를 대신하여 데이터베이스에 연결됩니다.

Code First 마이그레이션 후 Azure 앱

이제 이전처럼 할 일 목록을 편집할 수 있어야 합니다.

7. 리소스 정리

이전 단계에서는 리소스 그룹에서 Azure 리소스를 만들었습니다. 나중에 이러한 리소스가 필요하지 않을 것 같으면 Cloud Shell에서 다음 명령을 실행하여 리소스 그룹을 삭제합니다.

az group delete --name <group-name>

이 명령을 실행하는 데 1분 정도 걸릴 수 있습니다.

자주 묻는 질문

Login failed for user '<token-identified principal>'. 오류가 표시되는 이유는 무엇인가요?

이 오류의 가장 일반적인 원인은 다음과 같습니다.

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

  1. sqlcmd 또는 SSMS와 같은 데이터베이스 서버에 연결합니다.

  2. SQL Database 설명서에서 Microsoft Entra ID에 매핑된 포함된 사용자를 만듭니다.

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

    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에서 인증 미들웨어의 이점을 얻지 못합니다. 다음과 같은 몇 가지 대안이 있습니다.

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

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

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

다음 단계

학습한 내용은 다음과 같습니다.

  • Azure SQL Database에 대해 기본 제공 인증 사용
  • Azure SQL Database에서 다른 인증 옵션 사용 안 함
  • App Service 인증을 사용하도록 설정
  • ID 공급자로 Microsoft Entra ID 사용
  • 로그인한 Microsoft Entra 사용자를 대신하여 Azure SQL Database에 액세스