#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
.
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 в службе приложений, которая использует управляемую идентификацию (по умолчанию учетные данные) для доступа к ней для вас?