Azure App Service에서 Azure SQL Server로 배포된 Dotnet Core API의 관리 ID

7302 단어


1. Azure AD 사용자에게 데이터베이스 액세스 권한 부여



먼저 Azure AD 사용자를 서버 관리자로 할당하여 SQL Database에 대한 Azure Active Directory 인증을 활성화합니다. 이 사용자는 Azure 구독에 등록하는 데 사용한 Microsoft 계정과 다릅니다. Azure AD로 생성, 가져오기, 동기화 또는 초대한 사용자여야 합니다. 허용되는 Azure AD 사용자에 대한 자세한 내용은 SQL Database의 Azure AD 기능 및 제한 사항을 참조하세요.

Azure AD 테넌트에 아직 사용자가 없는 경우 Azure Active Directory를 사용하여 사용자 추가 또는 삭제의 단계에 따라 사용자를 만듭니다.

az ad user list 및 replace 를 사용하여 Azure AD 사용자의 개체 ID를 찾습니다. 결과는 변수에 저장됩니다.

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



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

az sql server ad-admin create --resource-group myResourceGroup --server-name <server-name> --display-name ADMIN --object-id $azureaduser



2. 개발 환경 설정



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

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

새 버전의 Microsoft.Data.SqlClient 버전이 등장하기 전에 System.Data.SqlClient를 사용하는 이전 방법




using Azure.Core;
using Azure.Identity;
using Microsoft.Azure.Services.AppAuthentication;

namespace DummyApi
{
    public class AzureSqlAuthTokenService : IDBAuthTokenService
    { 
        // See https://docs.microsoft.com/azure/active-directory/managed-identities-azure-resources/services-support-managed-identities#azure-sql
        private static readonly string[] _azureSqlScopes = new[]
        {
        "https://database.windows.net//.default"
        };

        private static readonly TokenCredential _credential = new ChainedTokenCredential(
            new ManagedIdentityCredential(),
            new EnvironmentCredential());

        public string GetToken()
        {
            AzureServiceTokenProvider provider = new AzureServiceTokenProvider(serviceProviderConnection);
            var token = provider.GetAccessTokenAsync("https://database.windows.net/").Result;
            return token;
        }
    }
}



위의 코드에서 "serviceProviderConnection"은 로컬 Visual Studio에서 디버깅할 때 다음 값을 갖습니다.

RunAs=Developer; DeveloperTool=VisualStudio



App Service에 배포되면 다음과 같이 업데이트됩니다.

RunAs=App



이 링크에서 전체 값을 참조하십시오.

https://docs.microsoft.com/en-us/dotnet/api/overview/azure/service-to-service-authentication#connection-string-support

SQLConnection에 연결할 때 위의 코드를 호출하는 방법 - 다음을 따르십시오.


                using (SqlConnection _connection = new SqlConnection())
                {
                    _connection.ConnectionString = sqlConnectionString;
                    _connection.AccessToken = authTokenService.GetToken();

                    _connection.Open();

                    // do some stuff with the sqlconnection to read or write record in SQL.

                    _connection.Close();

                    return true;
                }



3. 프로젝트 수정 - Microsoft.Data.SqlClient를 사용하는 새로운 방법



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

Install-Package Microsoft.Data.SqlClient -Version 4.0.1



토큰 생성 부분은 기본적으로 이 라이브러리에서 처리합니다.

ASP.NET Core 및 SQL Database 자습서에서 appsettings.json의 MyDbConnection 연결 문자열은 아직 전혀 사용되지 않습니다. 로컬 환경과 Azure 환경은 모두 원본 파일에서 연결 비밀을 유지하기 위해 각각의 환경 변수에서 연결 문자열을 가져옵니다. 그러나 이제 Active Directory 인증을 사용하면 더 이상 비밀이 없습니다. appsettings.json에서 MyDbConnection 연결 문자열의 값을 다음으로 바꿉니다.

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



                using (SqlConnection _connection = new SqlConnection(sqlConnectionString))
                {
                    _connection.Open();

                    // do some stuff with the sqlconnection to read or write record in SQL.

                    _connection.Close();

                    return true;
                }



4. 관리 ID 연결 사용



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

앱에서 관리 ID 사용



Azure 앱에 대한 관리 ID를 사용하도록 설정하려면 Cloud Shell에서 az webapp identity assign 명령을 사용합니다. 다음 명령에서 .

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



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

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



관리 ID에 권한 부여



Cloud Shell에서 SQLCMD 명령을 사용하여 SQL Database에 로그인합니다. 서버 이름, 앱에서 사용하는 데이터베이스 이름 및 Azure AD 사용자의 자격 증명으로 바꿉니다.

sqlcmd -S <server-name>.database.windows.net -d <db-name> -U <aad-user-name> -P "<aad-password>" -G -l 30



원하는 데이터베이스의 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



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

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

5. 변경 사항 게시



이제 남은 것은 변경 사항을 Azure에 게시하는 것입니다.



참조:



https://docs.microsoft.com/en-us/azure/app-service/tutorial-connect-msi-sql-database?tabs=windowsclient%2Cefcore%2Cdotnet

좋은 웹페이지 즐겨찾기