이 자습서에서는 로그인한 사용자를 가장하여 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를 사용하도록 환경을 준비합니다.
Bash 환경을 Azure Cloud Shell에서 사용합니다. 자세한 내용은 Azure Cloud Shell 시작을 참조하세요.
CLI 참조 명령을 로컬에서 실행하려면 Azure CLI를 설치하십시오. Windows 또는 macOS에서 실행 중인 경우 Docker 컨테이너에서 Azure CLI를 실행하는 것이 좋습니다. 자세한 내용은 Docker 컨테이너에서 Azure CLI를 실행하는 방법을 참조하세요.
로컬 설치를 사용하는 경우 az login 명령을 사용하여 Azure CLI에 로그인합니다. 인증 프로세스를 완료하려면 터미널에 표시되는 단계를 수행합니다. 다른 로그인 옵션은 Azure CLI를 사용하여 Azure에 인증을 참조하세요.
메시지가 표시되면 처음 사용할 때 Azure CLI 확장을 설치합니다. 확장에 대한 자세한 내용은 Azure CLI로 확장 사용 및 관리를 참조하세요.
az version을 실행하여 설치된 버전과 관련 종속 라이브러리를 확인합니다. 최신 버전으로 업그레이드하려면 az upgrade를 실행합니다.
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 명령을 실행합니다.
또는
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 디렉터리의 모든 사용자에 대한 정보를 표시할 수 있습니다.매개 변수를 사용하여
az sql server ad-admin createobject-idAzure 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>데이터베이스 서버 인증을 Microsoft Entra 인증으로만 제한합니다. 이 단계에서는 SQL 사용자 이름 및 암호 인증을 사용하지 않도록 설정합니다.
az sql server ad-only-auth enable --resource-group <group-name> --name <server-name>
- Microsoft Entra 사용자를 만드는 방법에 대한 자세한 내용은 Microsoft Entra ID를 사용하여 사용자 추가 또는 삭제를 참조하세요.
- SQL Database에 허용되는 Microsoft Entra 사용자에 대한 자세한 내용은 SQL Database 의 Microsoft Entra 기능 및 제한 사항을 참조하세요.
- Azure SQL Server 관리자를 추가하는 방법에 대한 자세한 내용은 서버에 대한 Microsoft Entra 관리자 프로비저닝을 참조하세요.
2. 앱에 Microsoft Entra ID 인증 사용
앱의 ID 공급자로 Microsoft Entra ID를 추가합니다. 자세한 내용은 App Services 애플리케이션에 대해 Microsoft Entra 인증 구성을 참조하세요.
앱의 Azure Portal 페이지에서 왼쪽 탐색 메뉴의 설정 아래에서 인증을 선택합니다.
인증 페이지에서 ID 공급자 추가를 선택하거나 ID 공급자 섹션에서 공급자 추가를 선택합니다.
ID 공급자 추가 페이지에서 공급자로 Microsoft를 선택합니다.
클라이언트 비밀 만료의 경우 권장: 180일과 같은 드롭다운 목록 옵션 중 하나를 선택합니다.
모든 기본 설정을 유지하고 추가를 선택합니다.
참고 항목
앱의 인증 설정을 다시 구성하는 경우 토큰 저장소의 토큰이 새 설정에서 다시 생성되지 않을 수 있습니다. 토큰이 다시 생성되도록 하려면 로그아웃하고 앱에 다시 로그인합니다. 쉬운 방법은 개인 모드에서 브라우저를 사용하는 것입니다. 앱에서 설정을 변경한 후 브라우저를 닫고 프라이빗 모드로 다시 엽니다.
3. SQL Database 사용자 가장 구성
로그인한 Microsoft Entra 사용자를 대신하여 SQL Database에 액세스할 수 있는 권한을 앱에 부여합니다.
앱의 인증 페이지에서 ID 공급자 아래에서 앱 이름을 선택합니다.
앱 등록 페이지가 열립니다. 이 등록은 Microsoft Entra 공급자를 추가할 때 자동으로 생성됩니다.
왼쪽 탐색 메뉴의 관리에서 API 권한을 선택합니다.
API 권한 페이지에서 권한 추가를 선택합니다.
요청 API 권한 화면에서 조직에서 사용하는 API 탭을 선택합니다.
검색 상자에 Azure SQL Database 를 입력하고 결과를 선택합니다.
애플리케이션에 필요한 사용 권한 유형 아래에서 위임된 권한을 선택한 다음, user_impersonation 옆의 확인란을 선택한 다음, 권한 추가를 선택합니다.
이제 Microsoft Entra의 앱 등록에는 로그인한 사용자를 가장하여 SQL Database에 연결하는 데 필요한 권한이 있습니다.
4. 사용 가능한 액세스 토큰을 반환하도록 App Service 구성
SQL Database에 사용할 수 있는 액세스 토큰을 제공하도록 앱을 구성하려면 앱의 Microsoft Entra 공급자loginParameters에 scope 추가 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 인증을 사용할 때 로컬로 디버그를 참조하세요.
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"]; }사용자 이름 및 암호로 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에 있는 경우:
새 앱 페이지에 앱이 표시되면 앱이 로그인한 Microsoft Entra 사용자를 대신하여 Azure SQL 데이터베이스에 연결됩니다. 앱을 평소처럼 사용하고 편집할 수 있어야 합니다.
7. 리소스 정리
이전 단계에서는 리소스 그룹에서 Azure 리소스를 만들었습니다. 이러한 리소스가 더 이상 필요하지 않은 경우 다음 명령을 실행하여 리소스 그룹을 삭제합니다.
az group delete --name <group-name>
이 명령을 실행하는 데 다소 시간이 걸릴 수 있습니다.
자주 묻는 질문
- "사용자 '토큰 식별 보안 주체>'<에 대한 로그인 실패" 오류가 표시되는 이유는 무엇인가요?
- Azure SQL Database에서 다른 Microsoft Entra 사용자 또는 그룹을 추가하려면 어떻게 해야 하나요?
- App Service 인증을 사용할 때 로컬로 디버그하려면 어떻게 하나요?
- 액세스 토큰이 만료되면 어떻게 되나요?
"사용자 '토큰 식별 보안 주체>'<에 대한 로그인 실패" 오류가 표시되는 이유는 무엇인가요?
오류의 가장 일반적인 원인 Login failed for user '<token-identified principal>' 은 다음과 같습니다.
- Azure SQL 데이터베이스에 대해 구성되지 않은 Microsoft Entra 인증입니다. Microsoft Entra 인증을 사용하여 데이터베이스 서버 구성을 참조하세요.
- 요청 헤더에 유효한 토큰이
X-MS-TOKEN-AAD-ACCESS-TOKEN없습니다. 이 코드는 로컬 환경에서 작동하지 않습니다. 자세한 내용 및 대안은 App Service 인증을 사용할 때 로컬로 디버그를 참조하세요. - 사용자에게 데이터베이스에 연결할 수 있는 권한이 없습니다. 사용자 및 권한을 추가하려면 Azure SQL Database에서 다른 Microsoft Entra 사용자 또는 그룹 추가를 참조하세요.
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 공급자 토큰 새로 고침을 참조하세요.