2017-12-18 17 views
0

내가 푸른 키 볼트에서 비밀을 액세스하는 데 문제가 있어요에서 푸른 키 볼트에 액세스 할 수 없습니다. 그 문제는 내가 적절하게 용어를 이해하지 않는 것이 의심, 그래서 다양한 API 호출에 공급하고있어 인수가 잘못되었습니다. 여기 데스크탑 콘솔 응용 프로그램

protected async Task<string> GetCommunityKeyAsync(UserConfiguration user) 
    { 
     var client = new KeyVaultClient( 
      new KeyVaultClient.AuthenticationCallback(GetAccessTokenAsync), 
      new HttpClient()); 

     // user.VaultUrl is the address of my key vault 
     // e.g., https://previously-created-vault.vault.azure.net 
     var secret = await client.GetSecretAsync(user.VaultUrl, "key-to-vault-created-in-azure-portal"); 

     return secret.Value; 
    } 

    private async Task<string> GetAccessTokenAsync(string authority, string resource, string scope) 
    { 
     var context = new AuthenticationContext(authority, TokenCache.DefaultShared); 

     // this line throws a "cannot identify user exception; see 
     // below for details 
     var result = 
      await context.AcquireTokenAsync(resource, "id-of-app-registered-via-azure-portal", new UserCredential()); 

     return result.AccessToken; 
    } 

가 슬로우됩니다의 예외입니다 :

여기 내가 사용하고 기본 코드의

Microsoft.IdentityModel.Clients.ActiveDirectory.AdalException
HRESULT = 0x80131500 메시지 = unknown_user : 사용자가 Source = Microsoft.IdentityModel.Clients.ActiveDirectory에 기록 된 을 식별 할 수 없습니다.
StackTrace : at Microsoft.Identi Microsoft.IdentityModel에서 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification에서 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw에서 tyModel.Clients.ActiveDirectory.AcquireTokenNonInteractiveHandler.d__4.MoveNext() ()
(작업 작업). Microsoft.IdentityModel.Clients에서 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (작업 작업)에서 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw에서 Clients.ActiveDirectory.AcquireTokenHandlerBase.d__57.MoveNext() ()
. ActiveDirectory.AuthenticationContext.d__37.MoveNext() Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContextIntegratedAuthExtensions.d__0.MoveNext에서 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification에서 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
(작업 작업)() 에서 0 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() System.Runtime.CompilerServices.TaskAwaiter 1.GetResult() at NextDoorScanner.ScannerJob.<GetAccessTokenAsync>d__21.MoveNext() in C:\Programming\CommunityScanner\CommunityScanner\ScannerJob.cs:line 197 at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.ConfiguredTaskAwaitable 1.ConfiguredTaskAwaiter.GetResult에서 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (작업 작업)에서
() 에서 마이크로 소프트. Azure.KeyVault.KeyVaultCredential.d__9.MoveNext() 에서 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification에서
(작업 작업) System.Runtime.CompilerServices.ConfiguredTaskAwaitable 1.ConfiguredTaskAwaiter.GetResult() at Microsoft.Azure.KeyVault.KeyVaultCredential.<ProcessHttpRequestAsync>d__10.MoveNext() at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.Azure.KeyVault.KeyVaultClient.<GetSecretWithHttpMessagesAsync>d__65.MoveNext() at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.ConfiguredTaskAwaitable
1.ConfiguredTaskAwaiter.GetResult() 에서 6,에서 Microsoft.Azure.KeyVault.KeyVaultClientExtensions.d__11.MoveNext() System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw에서 () System.Runtime에서 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (작업 작업)에서
. CompilerServices.TaskAwaiter,473,210 1.GetResult() C에서 NextDoorScanner.NextDoorScannerJob.d__4.MoveNext()에서 : \ 프로그래밍 \ CommunityScanner \ CommunityScanner \ NextDoorScannerJob.cs : 라인 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()에서 46에서 NextDoorScanner.Program에서 System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 에서 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (작업 작업).메인 (문자열 []에 args) C에서 : \ 프로그래밍 \ CommunityScanner \ CommunityScanner \ Program.cs : 라인

(22) I 않았다, 내가 PowerShell을 통해, 푸른 사용자로 바탕 화면을 등록 포함 생각한 일부 구성 :

내가 GetSecretAsync에 볼트 키()를 제공 할 예정 해요 경우
Login-AzureRmAccount 
// as I recall, this next line complained about the app ID already being defined 
New-AzureRmADServicePrincipal -ApplicationId 'id-of-app-previously-defined-via-azure-portal' 
Set-AzureRmKeyVaultAccessPolicy -VaultName 'vault-name' -ServicePrincipalName id-of-app-previously-defined-via-azure-portal -PermissionsToSecrets Get 

나는 분명 해요. 또한 새로 만든 UserCredential을 AcquireTokenAsync()에 전달하는 것 이외의 다른 작업을 수행해야하는지 궁금합니다. 마지막으로 중요한 온라인 볼트에 사용할 저장소 계정을 온라인으로 볼 수는 있지만 저장 계정의 "in"볼트를 만들지 않았습니다. 그리고 코드에서 스토리지 계정을 식별하지 못합니다.

도움말 또는 콘솔 데스크톱 앱에서 주요 볼트에 액세스하는 정말 좋은 예에 대한 참조는 감사하겠습니다.

답변

1

도움말 또는 콘솔 데스크톱 응용 프로그램의 주요 볼트에 액세스하는 정말 좋은 예에 대한 참조는 감사하겠습니다.

우리가 Azure Directory App을 등록한 후에는 assign role to application이 필요합니다. Azure Key Vault를 운영하려면 Key Vault를 운영 할 수있는 권한을 부여해야합니다. 키 저장소 용 리소스는 https://vault.azure.net입니다. 다른 SO thread에서도 자세한 정보를 얻을 수 있습니다.

데모 코드 : 나는 마침내 일을 일을하는 방법을 알아 낸 후 톰이 제공 한 것 외에도

static string appId = "application Id"; 
static string tenantId = "tenant id"; 
static string uri = "http://localhost:13526"; //redirect uri 
static void Main(string[] args) 
{ 
    var kv = new KeyVaultClient(GetAccessToken); 
    var scret = kv.GetSecretAsync("https://xxxx.vault.azure.net", "xxxx").GetAwaiter().GetResult(); 
} 

public static async Task<string> GetAccessToken(string azureTenantId,string clientId,string redirectUri) 
{ 
     var context = new AuthenticationContext("https://login.windows.net/" + tenantId); 
     var tokenResult = await context.AcquireTokenAsync("https://vault.azure.net", appId, new Uri(uri), new PlatformParameters(PromptBehavior.SelectAccount)); 
     return tokenResult.AccessToken; 
    } 
+0

Thanx, Tom. 의견과 아이디어뿐만 아니라 다른 SO 스레드에 대한 링크도 제공해 주셔서 감사합니다. –