Доступ к Azure KeyVault с помощью Azure.Идентичность в Xamarin.Формы заявки

#c# #azure #xamarin.forms #azure-keyvault

Вопрос:

У меня есть Xamarin.Бланки заявления. Мне нужно хранилище Azure для хранения некоторых данных. Очевидно, что я не хочу хранить подпись общего доступа (SAS) в своем приложении.

В своем приложении я разработал KeyVaultService :

 private readonly Azure.Security.KeyVault.Secrets.SecretClient _keyVaultSecretClient;

public KeyVaultService() 
    => _keyVaultSecretClient = new(
        new Uri("https://foo.vault.azure.net/"), 
        new DefaultCredential());

// ...

public async Task<string> GetSecretAsync(string secretName)
{
    // ...
    var response = await _keyVaultSecretClient.GetSecretAsync(secretName);
    // ...
    return response.Value.Value;
}

 

A AzureStorageService :

 private readonly IKeyVaultService _keyVaultService;
public AzureStorageService() => _keyVaultService = DependencyService.Get<IKeyVaultService>();

public async Task<byte[]> GetFooAsync()
{
    var connectionString = await _keyVaultService.GetSecretAsync(STORAGE_CONNECTIONSTRING);
    _blobContainerClient = new BlobContainerClient(connectionString, CONTAINER_NAME);
}

 

И это называется так:

 byte[]? fooBytes = await _azureStorageService.GetFooAsync();
await DoSomething(fooBytes);

 

Тесты

Второй параметр SecretClient является Azure.Identity.TokenCredential производным классом. С моим _keyVaultSecretClient экземпляром, в моем KeyVaultService , я попытался использовать некоторые классы ( DefaultAzureCredential , ClientSecretCredential , …):

DefaultAzureCredential и ClientSecretCredential

 public KeyVaultService() => new(new Uri("foo...."), new DefaultAzureCredential())
 

и

 public KeyVaultService() => new(new Uri("foo...."), new ClientSecretCredential(TENANT_ID, CLIENT_ID, CLIENT_SECRET))
 

An exception throws:

 Azure.Identity.AuthenticationFailedException: 

'ClientSecretCredential authentication failed: Confidential Client flows are not available on mobile platforms or on Mac.See https://aka.ms/msal-net-confidential-availability for details.'

Inner Exception:

PlatformNotSupportedException: Confidential Client flows are not available on mobile platforms or on Mac.See https://aka.ms/msal-net-confidential-availability for details.
 

And I don’t want to keep Tenant ID, Client ID or Secret ID in my code

EnvironmentCredential

 public KeyVaultService() => new(new Uri("foo...."), new EnvironmentCredential())
 

I have add 3 environment variables on my Windows: AZURE_CLIENT_ID , AZURE_CLIENT_SECRET and AZURE_TENANT_ID .

enter image description here

AuthenticationFailedException is thrown, again.

ManagedIdentityCredentials

 public KeyVaultService() => new(new Uri("foo...."), new ManagedIdentityCredential(CLIENT_ID))
 

Another exception throws:

 Azure.Identity.CredentialUnavailableException: 

'ManagedIdentityCredential authentication unavailable. No Managed Identity endpoint found.'
 

Where and how can I add an Identity endpoint ?

The client ID is in the code!! Nooo 🙁


Information

Mobile Apps Key Vault Don’t do it

Я прочитал это сообщение в блоге: https://codemilltech.com/mobile-apps-azure-keyvault-dont-do-it/, Но… Если анонимный пользователь нашел URL-адрес моей функции Azure… Он может прочитать мой адрес Хранилища ключей… И мое приложение выдает те же исключения… Я думаю, что это мой подход.

Разработать функцию Azure, которая получает доступ к хранилищу ключей и его секретам, а затем отправляет их мне обратно через API? Ооо: Все мои секреты могут быть раскрыты. Нет, спасибо.


Я прочитал ссылку, предоставленную исключением (https://aka.ms/msal-net-confidential-availability). МСАЛ? Почему для Azure? Насколько я понял, MSAL позволяет подключаться к API Microsoft Graph и Office 365…


В резюме

Я понимаю, что мой подход недоступен на мобильных платформах (исключение достаточно понятно, чтобы догадаться, я обещаю)-потому что телефон не является полностью безопасным устройством?

Итак, какова реализация использования хранилища ключей Azure или другого решения для безопасного доступа к моему хранилищу Azure?

На самом деле,

  • Я хочу, чтобы в моем коде не было секретов;
  • Мне нужен доступ к хранилищу Azure с SAS, к серверу SAP с именем пользователя/паролем и другим внешним службам (хранящимся в Хранилище ключей — или другим безопасным способом).

У кого-нибудь есть идея?

Заранее спасибо 🙂

Комментарии:

1. В идеале у вас должна быть конечная точка API, откуда вы должны запросить токен SAS и использовать этот токен в своем мобильном приложении для взаимодействия с хранилищем Azure.

2. Хорошо, если это мобильное приложение, а не чтение хранилища Azure напрямую, возможно, создайте конечную точку REST в службе приложений, которая использует управляемую идентификацию (по умолчанию учетные данные) для доступа к ней для вас?