자습서: 관리 ID를 사용하여 비밀 없이 .NET App Service에서 SQL Database 연결

App Service는 Azure에서 확장성 높은 자체 패치 웹 호스팅 서비스를 제공합니다. 또한 Azure SQL Database 및 기타 Azure 서비스에 대한 액세스를 보호하기 위한 턴키 솔루션인 관리 ID를 앱에 제공합니다. App Service의 관리 ID는 연결 문자열의 자격 증명과 같은 비밀을 앱에서 제거하여 앱의 보안을 보다 강화합니다. 이 자습서에서는 다음 자습서 중 하나에서 빌드한 샘플 웹앱에 관리 ID를 추가합니다.

완료되면 샘플 앱은 사용자 이름과 암호 없이도 안전하게 SQL Database에 연결됩니다.

Architecture diagram for tutorial scenario.

참고 항목

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

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

다른 언어 프레임워크(Node.js, Python 및 Java)에서 Azure Database for MySQL 또는 Azure Database for PostgreSQL에 대한 지침은 자습서: 관리 ID를 사용하여 비밀 없이 App Service에서 Azure 데이터베이스에 연결을 참조하세요.

다음을 알아봅니다.

  • 관리 ID 사용
  • 관리 ID에 SQL Database 액세스 권한 부여
  • SQL Database에서 Microsoft Entra 인증을 사용하도록 Entity Framework 구성
  • Visual Studio에서 Microsoft Entra 인증을 사용하여 SQL Database에 연결

참고 항목

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

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

필수 조건

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

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

SQL Database를 백 엔드로 사용하여 앱을 디버깅하려면 컴퓨터에서 클라이언트 연결을 허용했는지 확인합니다. 그렇지 않은 경우 Azure Portal를 사용하여 서버 수준 IP 방화벽 규칙 관리의 단계에 따라 클라이언트 IP를 추가합니다.

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

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 myResourceGroup --server-name <server-name> --display-name ADMIN --object-id $azureaduser
    

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

2. 개발 환경 설정

  1. Windows용 Visual Studio는 Microsoft Entra 인증과 통합됩니다. Visual Studio에서 개발 및 디버깅을 사용하도록 설정하려면 Visual Studio의 메뉴에서 파일>계정 설정을 선택하여 Microsoft Entra 사용자를 추가하고 로그인 또는 추가를 선택합니다.

  2. Azure 서비스 인증의 Microsoft Entra 사용자를 설정하려면 메뉴에서 도구>옵션을 선택한 후 Azure 서비스 인증>계정 선택을 선택합니다. 추가한 Microsoft Entra 사용자를 선택하고 확인을 선택합니다.

Microsoft Entra 인증을 위해 개발 환경을 설정하는 방법에 대한 자세한 내용은 .NET용 Azure ID 클라이언트 라이브러리를 참조하세요.

이제 백 엔드 SQL Database에서 Microsoft Entra 인증을 사용하여 앱을 개발하고 디버그할 준비가 되었습니다.

3. 프로젝트 수정

참고 항목

Microsoft.Azure.Services.AppAuthentication은 더 이상 새 Azure SDK에서 사용하지 않는 것이 좋습니다. .NET, Java, TypeScript 및 Python에서 사용할 수 있는 새 Azure ID 클라이언트 라이브러리로 대체되며 모든 새로운 개발에 사용해야 합니다. 마이그레이션하는 방법에 대한 정보는 Azure IdentityAppAuthentication to Azure.Identity 마이그레이션 지침에서 찾을 수 있습니다.

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

  1. Visual Studio에서 패키지 관리자 콘솔을 열어 NuGet 패키지 Microsoft.Data.SqlClient를 추가합니다.

    Install-Package Microsoft.Data.SqlClient -Version 5.1.0
    
  2. ASP.NET Core 및 SQL Database 자습서에서는 appsettings.jsonMyDbConnection 연결 문자열이 아직 사용되지 않습니다. 로컬 환경과 Azure 환경은 모두 원본 파일에서 연결 비밀을 유지하기 위해 해당 환경 변수에서 연결 문자열을 가져옵니다. 하지만 이제 Active Directory 인증을 사용하면 더 이상 비밀이 없습니다. appsettings.json에서 연결 문자열 MyDbConnection의 값을 다음으로 바꿉니다.

    "Server=tcp:<server-name>.database.windows.net;Authentication=Active Directory Default; Database=<database-name>;"
    

    참고 항목

    Active Directory 기본 인증 유형은 로컬 머신과 Azure App Service 모두에서 사용할 수 있습니다. 드라이버는 다양한 방법으로 Microsoft Entra ID에서 토큰을 획득하려고 시도합니다. 앱이 배포되면 앱의 관리 ID에서 토큰을 가져옵니다. 앱이 로컬로 실행되는 경우 Visual Studio, Visual Studio Code, Azure CLI에서 토큰을 가져오려고 시도합니다.

    이것만 있으면 SQL Database에 연결할 수 있습니다. Visual Studio에서 디버그할 때 코드는 2. 개발 환경 설정에서 구성한 Microsoft Entra 사용자를 사용합니다. App Service 앱의 관리 ID에서 연결할 수 있도록 SQL Database를 나중에 설정합니다. DefaultAzureCredential 클래스는 메모리에서 토큰을 캐시하여 만료 직전에 Microsoft Entra ID에서 검색합니다. 토큰을 새로 고치는 데 사용자 지정 코드는 필요하지 않습니다.

  3. Ctrl+F5를 입력하여 앱을 다시 실행합니다. 이제 브라우저에서 동일한 CRUD 앱이 Microsoft Entra 인증을 사용하여 Azure SQL Database에 직접 연결합니다. 이 설정을 사용하면 Visual Studio에서 데이터베이스 마이그레이션을 실행할 수 있습니다.

4. 관리 ID 연결 사용

다음으로, 시스템에서 할당한 관리 ID를 사용하여 SQL Database에 연결하도록 App Service 앱을 구성합니다.

참고 항목

이 섹션의 지침은 시스템 할당 ID에 대한 것이지만 사용자 할당 ID를 쉽게 사용할 수 있습니다. 이렇게 하려면 다음을 수행합니다. 원하는 사용자 할당 ID를 할당하려면 az webapp identity assign command를 변경해야 합니다. 그런 다음, SQL 사용자를 만들 때 사이트 이름이 아닌 사용자 할당 ID 리소스의 이름을 사용해야 합니다.

앱에서 관리 ID 사용

Azure 앱의 관리 ID를 사용하려면 Cloud Shell에서 az webapp identity assign 명령을 사용합니다. 다음 명령에서 <app-name>을 바꿉니다.

az webapp identity assign --resource-group myResourceGroup --name <app-name>

참고 항목

배포 슬롯에 대해 관리 ID를 사용하도록 설정하려면 --slot <slot-name>을 추가하고 <slot-name>에 있는 슬롯 이름을 사용합니다.

출력 예는 다음과 같습니다.

{
  "additionalProperties": {},
  "principalId": "21dfa71c-9e6f-4d17-9e90-1d28801c9735",
  "tenantId": "72f988bf-86f1-41af-91ab-2d7cd011db47",
  "type": "SystemAssigned"
}

관리 ID에 사용 권한 부여

참고 항목

원하는 경우 ID를 Microsoft Entra 그룹에 추가한 다음 ID 대신 Microsoft Entra 그룹에 대한 SQL Database 액세스 권한을 부여할 수 있습니다. 예를 들어 다음 명령은 이전 단계의 관리 ID를 myAzureSQLDBAccessGroup이라는 새 그룹에 추가합니다.

$groupid=(az ad group create --display-name myAzureSQLDBAccessGroup --mail-nickname myAzureSQLDBAccessGroup --query objectId --output tsv)
$msiobjectid=(az webapp identity show --resource-group myResourceGroup --name <app-name> --query principalId --output tsv)
az ad group member add --group $groupid --member-id $msiobjectid
az ad group member list -g $groupid
  1. Cloud Shell에서 SQLCMD 명령을 사용하여 SQL Database에 로그인합니다. <server-name>을 서버 이름으로 바꾸고, <db-name>을 앱에서 사용하는 데이터베이스 이름으로 바꾸고, <aad-user-name><aad-password>를 Microsoft Entra 사용자의 자격 증명으로 바꿉니다.

    sqlcmd -S <server-name>.database.windows.net -d <db-name> -U <aad-user-name> -P "<aad-password>" -G -l 30
    
  2. 원하는 데이터베이스에 대한 SQL 프롬프트에서 다음 명령을 실행하여 앱에 필요한 최소 권한을 부여합니다. 예를 들면 다음과 같습니다.

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

    <identity-name>은 Microsoft Entra ID의 관리 ID 이름입니다. ID가 시스템 할당된 경우 이름은 App Service 앱의 이름과 항상 동일합니다. 배포 슬롯의 경우 시스템 할당 ID의 이름은 <app-name>/slots/<slot-name>입니다. Microsoft Entra 그룹에 대한 사용 권한을 부여하려면 대신 그룹의 표시 이름을 사용합니다(예: myAzureSQLDBAccessGroup).

  3. EXIT를 입력하여 Cloud Shell 프롬프트로 돌아갑니다.

    참고 항목

    또한 관리 ID의 백 엔드 서비스는 만료된 경우에만 대상 리소스에 대한 토큰을 업데이트하는 토큰 캐시를 유지 관리합니다. SQL Database 사용 권한을 구성하는 실수를 하고 앱을 사용하여 토큰을 가져오려고 시도한 에 사용 권한을 수정하려고 하는 경우 캐시된 토큰이 만료될 때까지 실제로 업데이트된 권한으로 새 토큰을 얻을 수 없습니다.

    참고 항목

    Microsoft Entra ID 및 관리 ID는 온-프레미스 SQL Server에서 지원되지 않습니다.

연결 문자열 수정

Web.config 또는 appsettings.json에서 변경한 내용은 관리 ID와 함께 작동하므로 Visual Studio가 처음으로 앱을 배포할 때 만든 기존 연결 문자열을 App Service에서 제거하기만 하면 됩니다. 다음 명령에서 <app-name>을 앱의 이름으로 바꾸어 사용합니다.

az webapp config connection-string delete --resource-group myResourceGroup --name <app-name> --setting-names MyDbConnection

5. 변경 내용 게시

이제 Azure에 변경 내용을 게시하면 됩니다.

  1. 자습서: SQL Database를 사용하여 Azure에서 ASP.NET 앱 빌드를 진행 중이었다면 Visual Studio에서 변경 내용을 게시합니다. 솔루션 탐색기에서 DotNetAppSqlDb 프로젝트를 마우스 오른쪽 단추로 클릭하고 게시를 선택합니다.

    Publish from Solution Explorer

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

    Important

    앱 서비스 이름이 기존 앱 등록과 일치하지 않는지 확인합니다. 이로 인해 보안 주체 ID가 충돌합니다.

새 웹 페이지에 할 일 목록이 표시되면 앱이 관리 ID를 사용하여 데이터베이스에 연결합니다.

Azure app after Code First Migration

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

리소스 정리

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

az group delete --name myResourceGroup

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

다음 단계

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

  • 관리 ID 사용
  • 관리 ID에 SQL Database 액세스 권한 부여
  • SQL Database에서 Microsoft Entra 인증을 사용하도록 Entity Framework 구성
  • Visual Studio에서 Microsoft Entra 인증을 사용하여 SQL Database에 연결