如何以静默方式获取用户订阅Azure批处理的访问令牌?

如何以静默方式获取用户订阅Azure批处理的访问令牌?,azure,active-directory,azure-active-directory,azure-batch,Azure,Active Directory,Azure Active Directory,Azure Batch,我正在做一个项目,在这个项目中,我们有一个在Azure批处理上以用户订阅模式运行计算的服务,因为我们使用的是自定义映像。现在我的代码已经完全正常工作了,但它要求每次启动都提供用户凭据以登录Azure Active Directory应用程序,然后才能创建批处理池等等。因为它将作为后台服务运行,所以我需要使用提供的用户以静默方式登录,而不会弹出要求用户登录的弹出窗口 我已经在Azure中注册了本机应用程序,并设置了对Azure批处理服务的访问权限,创建了Azure AD用户,并从中获取了所有ID和

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

我已经在Azure中注册了本机应用程序,并设置了对Azure批处理服务的访问权限,创建了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批处理,这可能吗

感谢您的帮助。

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

AcquireTokenAsync将弹出一个登录对话框,因此您也不能在批处理应用程序中使用该对话框

请查看使用或进行身份验证

在第一个示例中,您需要使用创建ClientAssertionCertificate

certCred=新客户证书CertificateClientId,证书; 然后用于AcquireTokenAsync:

结果=等待authContext.AcquireTokenAsyncToDolstresourceId,certCred; 另一个示例使用创建UserPasswordCredential

var uc=新用户密码CredentialUser,密码; 然后以稍微不同的方式将其与AcquireTokenAsync一起使用:

authContext.AcquireTokenAsyncToDolstresourceId、clientId、uc;
对于基于两种不同身份验证方法的令牌,您可以做些什么有一些限制。例如,使用访问令牌进行EWS模拟需要使用证书方法。

或证书的第三个选项。使用该类。非常感谢各位,UserPasswordCredentials可以满足我的需要。