0

私はAzure Batchでユーザーサブスクリプションモードで計算を実行するサービスを提供しています(カスタムイメージを使用しているため)。私のコードは完全に動作していますが、バッチプールなどを作成する前にAzure Active Directoryアプリにログインするためのユーザー資格情報を提供するためには、すべての起動が必要です。バックグラウンドサービスとして実行されるので、私は何人かのユーザーと一緒にサインインして、ログインするように要求します。ユーザ登録Azure Batchにアクセストークンを自動的に取得する方法

私はAzureにネイティブアプリを登録し、Azureバッチサービスへのアクセスを設定しました。それからすべての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を指定されたユーザーにサイレントログインさせることができますし、これも可能ですか?

ありがとうございました。

答えて

1

AcquireTokenSilentは、この使用例のためのものではありません。これは、以前に格納されていたキャッシュからトークンを取得しようとしますAcquireTokenAsync

そしてAcquireTokenAsyncはログインダイアログをポップアップするので、バッチアプリでも使用できません。

certificateまたはusername/passwordで認証するかどうかを確認してください。

最初のサンプルで

、あなたはこれがその後、AcquireTokenAsyncのために使用されている

certCred = new ClientAssertionCertificate(clientId, cert); 

ClientAssertionCertificateを作成する必要があります。

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

他のサンプルは

var uc = new UserPasswordCredential(user, password); 
UserPasswordCredentialを作成します

を入力し、少し異なる方法で10:

使用すると、2つの異なる認証方法に基づいているトークンで何ができるかのようにいくつかの制限があります
authContext.AcquireTokenAsync(todoListResourceId, clientId, uc); 

。たとえば、EWS偽装のアクセストークンを使用するには、証明書メソッドを使用する必要があります。

+1

または[アプリケーションとサービスプリンシパルのクライアント秘密/認証キー]の3番目のオプション(https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create) -service-principal-portal)を指定します。 [AcquireTokenAsync](https://msdn.microsoft.com/en-us/library/microsoft.identitymodel.clients.activedirectory.clientcredential.aspx)クラスの[ClientCredential](https://msdn.microsoft.com/)を使用します。 ja-jp/library/microsoft.identitymodel.clients.activedirectory.authenticationcontext.aspx)。 – fpark

+0

@fparkそれはオプションでもあります。 – RasmusW

+0

ありがとう、私が必要とするUserPasswordCredentialsが動作します。 – Daniel

関連する問題