0

我正在做一个项目,我们有服务以用户订阅模式在 Azure Batch 上运行计算(因为我们使用的是自定义图像)。我的代码现在可以完全正常工作,但它需要每次启动都提供用户凭据以登录 Azure Active Directory 应用程序,然后才能创建批处理池等。因为它将作为后台服务运行,所以我需要使用一些提供的用户静默登录,而不会弹出要求用户登录。

我已经在 Azure 中注册了本机应用程序,并设置了它对 Azure Batch 服务的访问权限,创建了 Azure AD 用户,并从中获取了所有 ID 和名称。

这是我现在正在使用的代码。

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 中使用的 ID 是从 Azure Active Directory 用户刀片获取的用户 ID GUID。

有谁知道,如何更新我的代码,以便我能够以指定用户静默登录 Azure Batch,这甚至可能吗?

感谢帮助。

4

1 回答 1

1

AcquireTokenSilent不适用于此用例。它将尝试从之前存储令牌的缓存中获取令牌AcquireTokenAsync

并且AcquireTokenAsync会弹出一个登录对话框,因此您也不能在批处理应用程序中使用它。

看看使用证书用户名/密码进行身份验证。

在第一个示例中,您需要创建一个ClientAssertionCertificatewith

certCred = new ClientAssertionCertificate(clientId, cert);

然后用于AcquireTokenAsync

result = await authContext.AcquireTokenAsync(todoListResourceId, certCred);

另一个示例创建了一个UserPasswordCredentialwith

var uc = new UserPasswordCredential(user, password);

然后也以AcquireTokenAsync稍微不同的方式使用它:

authContext.AcquireTokenAsync(todoListResourceId, clientId, uc);

对于您可以使用基于两种不同身份验证方法的令牌执行的操作存在一些限制。例如,使用 EWS 模拟的访问令牌需要使用证书方法。

于 2017-04-25T14:54:05.383 回答