Azure Key&Vault 사용 후 IIS 배포가 안됩니다.

우선 아래 글 처럼 세팅을 했습니다.

그리고Greg.Lee님께서 알려주신 대로 VS2022에 서비스등록까지 했습니다.
(VS2022에 서비스등록)

그리고 IIS에 배포하면 500에러가 뜹니다.

애저 사용안 한 솔루션을 IIS에 배포하면 잘 되는데
애저 사용한 솔루션이 500에러가 자꾸 뜹니다.

Azure KeyVault에도 모든네트워크 허용해주었고
Access Configuration의 Permission model은 Vault Access Policy 체크했습니다.
물론 제 Access는 Full Access이고 Role도 Owner, Administrator입니다.

이번에도 도움 부탁 드리겠습니다ㅠㅠ…
감사합니다!

1개의 좋아요

아래 문서를 참고하세요.

Azure Key Vault configuration provider in ASP.NET Core | Microsoft Learn

문서의 내용만 요약하자면, (저는 사용해 본 적 없습니다.)

앱을 애져 환경에 배포하는 경우와 로컬 환경에 배포하는 경우에 따라 애져 키벌트 접근법이 다르다고 하네요.

원 질문의 코드는 애저 환경에 배포하는 경우에 동작하는 코드인 것 같습니다.

위 링크의 내용 중에 샘플 앱의 링크가 있는데, 애져 배포 또는 로컬 배포에 맞는 서비스 설정 코드가 나와 있습니다.

AspNetCore.Docs/aspnetcore/security/key-vault-configuration/samples/6.x/KeyVaultConfigurationSample/Program.cs at main · dotnet/AspNetCore.Docs · GitHub

Certificate : 로컬 배포
Managed : 애져 배포

1개의 좋아요

오오 감사합니다!
잘 참고해서 해결해보도록 하겠습니다.

감사합니다!!

1개의 좋아요

아… 제가 말씀드린 건 KV 앱을 호출할 때 필요한 계정을 얘기한 거 였어요.

개념적으로는

요기를 참고하시면 어느 정도 이해가 될 거예요.

그래서 간단히 얘기하자묜…
결국 KV 를 이용한다는 건

string keyVaultName = Environment.GetEnvironmentVariable("KEY_VAULT_NAME");
var kvUri = "https://" + keyVaultName + ".vault.azure.net";

var client = new SecretClient(new Uri(kvUri), new DefaultAzureCredential());
var secret = await client.GetSecretAsync(secretName);

요렇게 client 를 생성하고 요 client 를 이용해 KV 의 api 를 호출하여
내가 보관해놓은 민감정보를 가져오겠다… 라는 거예요.
(당연히 get 뿐만 아니라 set api 도 있어요.)

그리고 IConfiguration 에 KV client 를 할당하는 구문은 (AddAzureKeyVault())
내부적으로 전용 SecretClient 를 생성해
IConfiguration 에 KV 호출을 위한 전용 provider 를 등록시키는 과정이에요.

이후 IConfiguration 에 접근해 인덱서로 키를 호출하면 KV provider 를 통해 앞에서 생성해 붙여뒀던 SecretClient 를 호출하는 거죠.
(정확히 얘기하자면 provider 등록 시점에 해당 KV 의 모든 값을 다 읽어와 내부 캐쉬로 들고 있다가 이후 IConfiguration 의 인덱서로 키 접근을 하면 값을 반환하는 방식이에요.)

어쨌뚠 그렇다면,
이렇게 Azure 에 접근해서 KV 를 이용하기 위해서는
client 호출 시 이용 가능한(접근 가능한) 인증정보를 client 호출에 함께 실어 보내야겠죠?

그 인증 정보를 client 에 할당하는 객체가 DefaultAzureCredential 입니다.
DefaultAzureCredential 는 로컬 머신에 할당된 정보를 읽어서
client 에 포함시키는 역할을 해요.

요걸 사용하려면 로컬 머신(KV를 호출하는 앱 위치)에 DefaultCredential 을 로딩할 수 있는 정보가 할당되어 있어야 합니다.

대략 ms 공식문서보다 잘 정리되어 있다는 건 안 비밀



가령, az cli (Azure Cloud shell)를 이용해 권한이 있는 계정으로 logon 한 상태이거나
azure KV 앱에 할당된 Tenant Id, App Id, App Secret 을 환경변수에 할당해둔 상태 이거나
VS 로그인이 되어있어서 인식할 수 있는 상태 등등

요런 account 정보가 머신에 할당되어 있을 때 DefaultAzureCredential 에서 그 값을 읽어서
KV 에 request 를 보낼 때 인증 정보로 활용합니다.
인증 정보 로딩에도 우선순위가 있었는데 아마 환경변수에 관련 정보 할당하는 게 가장 높았던 걸로 기억이 나네요.
(저는 업무에서 docker 로 말아서 aks 에 올려서 사용하고 있는데요. 배포할 때 container 환경변수에 인증정보 할당해서 사용하고 있어요.)

그게 아니면 @BigSquare 님이 남겨주신 링크에 표시된 대로
수동으로 코드에(정확히는 appsettings 에 기록된) 인증 정보를 넣어서 사용해야합니다.

var crednetial = new ClientCertificateCredential(
            builder.Configuration["AzureADDirectoryId"],
            builder.Configuration["AzureADApplicationId"],
            x509Certificate)

요런 식으루 말이죠.


사실 요거 작년 .NET L!VE SPRING 에서 제가 발표한 내용이긴한데
쌉소리를 너무 길게해서 실제 사용법을 디테일하게 전달하지 못한 부분이긴해요…

=ㅁ=;;;

3개의 좋아요

참고로 환경변수에 필요한 기본 정보는

AZURE_TENANT_ID = AAD 가서 현재 디렉토리의 `테넌드ID`
AZURE_CLIENT_ID = AAD 의 앱등록 화면에서 방금 등록했던 앱의 ID
AZURE_CLIENT_SECRET = AAD 의 앱등록 화면에서 방금 등록했던 앱의 암호.

요 정보들이에요.
요 정보들은 Azure 포탈에서 App 을 통해 확인할 수 있습니다.

덧,
참고로 AZURE_CLIENT_SECRET 요기에 할당해야하는 client secret 은
AAD 의 앱 등록 당시 생성한 secret 인데요.
앱 등록 직후 표시되는 secret 을 페이지를 나가기 전 반드시! 꼭! 따로 보관해야합니다.

client secret 은 등록 페이지를 벗어나면 그 이후 영원히 다시 표시되지 않습니다.

2개의 좋아요

너무 감사합니다…ㅠㅠ
.NET LIVE SPRING에서 발표하신 내용 볼 수 있는 곳이 있을까요?

구글링을 해도 내용은 안 나와 있네요.

저번글도 이번글도 넘 고맙습니다!
많이 배워갑니다.

1개의 좋아요

@jamesnet214 ;ㅁ;

2개의 좋아요

앗 그때 녹화 문제가 좀 있었던 것 같습니다. ㅠ

1개의 좋아요