Как молча получить токен доступа к пользовательской подписке 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 требует использования метода сертификата.

Другие вопросы по тегам