Как молча получить токен доступа к пользовательской подписке Azure Batch?
Я работаю над проектом, где у нас есть служба, которая выполняет вычисления в пакетном режиме Azure в режиме подписки пользователя (потому что мы используем пользовательское изображение). Теперь мой код полностью работает, но при каждом запуске требуется предоставить учетные данные пользователя для входа в приложение Azure Active Directory, прежде чем оно сможет создавать пакетные пулы и так далее. Поскольку он будет работать в качестве фоновой службы, мне нужно войти в систему в режиме без вывода сообщений с каким-либо предоставленным пользователем без всплывающего окна с просьбой войти в систему.
Я зарегистрировал собственное приложение в Azure и установил его доступ к пакетной службе Azure, создал пользователя Azure AD и получил от него все идентификаторы и имена.
Вот мой код, который я сейчас использую.
private const string AuthorityUri = "https://login.microsoftonline.com/common";
private const string BatchResourceUri = "https://batch.core.windows.net";
private const string BatchAccountEndpoint = "https://<BATCH SERVICE NAME>.westeurope.batch.azure.com";
private const string ClientId = "<AZURE APP GUID ID>";
...
public static async Task<string> GetAuthenticationTokenAsync()
{
var authContext = new AuthenticationContext(AuthorityUri);
//here it will throw exception about no token found in cache and to call AquireToken
var authResult = await authContext.AcquireTokenSilentAsync(BatchResourceUri, ClientId, new UserIdentifier("<AD USER GUID ID>", UserIdentifierType.UniqueId));
//this works fine, but show popup dialog for login
/*var authResult = await authContext.AcquireTokenAsync(BatchResourceUri,
ClientId,
new Uri(RedirectUri),
new PlatformParameters(PromptBehavior.Auto));*/
return authResult.AccessToken;
}
...
Func<Task<string>> tokenProvider = () => GetAuthenticationTokenAsync();
using (BatchClient batchClient = await BatchClient.OpenAsync(new BatchTokenCredentials(BatchAccountEndpoint, tokenProvider)))
{
...
}
Классический способ с AquireToken с всплывающим окном для входа в систему работает нормально. Я пытался использовать AquireTokenSilent (как показано в коде), но я получаю ошибку об отсутствии кэша токена, и мне нужно вызвать AquireToken.
Идентификатор, используемый в UserIdentifier, - это идентификатор пользователя, полученный из блейда пользователя Azure Active Directory.
Кто-нибудь знает, как обновить мой код, чтобы я мог беззвучно войти в пакет Azure с указанным пользователем, и это вообще возможно?
Спасибо за помощь.
1 ответ
AcquireTokenSilent
не предназначен для этого варианта использования. Он попытается получить токен из кэша, в котором он был ранее сохранен AcquireTokenAsync
,
А также AcquireTokenAsync
появится диалоговое окно входа в систему, так что вы не можете использовать его в своем пакетном приложении.
Посмотрите на аутентификацию с помощью сертификата или с помощью имени пользователя / пароля.
В первом примере вам нужно создать ClientAssertionCertificate
с
certCred = new ClientAssertionCertificate(clientId, cert);
это затем используется для AcquireTokenAsync
:
result = await authContext.AcquireTokenAsync(todoListResourceId, certCred);
Другой образец создает UserPasswordCredential
с
var uc = new UserPasswordCredential(user, password);
а затем также использует его с AcquireTokenAsync
немного по-другому:
authContext.AcquireTokenAsync(todoListResourceId, clientId, uc);
Существуют некоторые ограничения в отношении того, что вы можете делать с токенами, основанными на двух разных методах аутентификации. Например, использование токена доступа для олицетворения EWS требует использования метода сертификата.