1

サービス プリンシパルを使用して Azure Function から Batch プールにアクセスしようとしていますが、理解できない認証の問題が発生しています。サービス プリンシパルを使用した最初のログインは正常に機能しますが、資格情報を使用してバッチ プールにアクセスすると、401 が返されます。

以下は、キーポイントにコメントを付けた私のコードの要約版です

module.exports.dispatch = function (context) {

    MsRest.loginWithServicePrincipalSecret('AppId', 'Secret', 'TennantId', function(err, credentials){

        if (err) throw err;
        // This works as it prints the credentials
        context.log(credentials);

        var batch_client = new batch.ServiceClient(credentials, accountUrl);

        batch_client.pool.get('mycluster', function(error, result){

            if(error === null)
            {
                context.log('Accessed pool');
                context.log(result);
            }
            else
            {
                //Request to batch service returns a 401
                if(error.statusCode === 404)
                {
                    context.log('Pool not found yet returned 404...');

                }
                else
                {
                    context.log('Error occurred while retrieving pool data');
                    context.log(error);
                }

                //'Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly.
                context.res = { body: error.body.message.value };
                context.done();
            }
        });
    });
};

サービス プリンシパルを使用した最初のログインは問題なく機能するのに、それが返す資格情報がバッチ プールにアクセスできないのはどうしてでしょうか?

実際のエラーは、リクエストの認証ヘッダーを確認するように指示していますが、これは確認でき、Authorization ヘッダーさえ存在しません。

バッチ アカウントの Active Directory アクセス制御を 3 回確認しました。アプリ ID とシークレットは、バッチ アカウントの所有者のものです。次に何を試すべきか?

4

3 に答える 3

0

たまたまこの同じ問題に出くわしましたが、SharedKeyCredentials を使用するオプションがなかったため、他の誰かが役立つ場合に備えてソリューションを共有したいと考えました。

fpark が言及しているように、デフォルトの Azure Resource Management の代わりに Batch で使用する OAuth トークンを取得する必要があります。以下は、Mark が投稿した元のコードで、Batch で動作させるために必要なわずかな変更が加えられています。

module.exports.dispatch = function (context) {

    let authOptions = {tokenAudience: 'batch'};

    MsRest.loginWithServicePrincipalSecret('AppId', 'Secret', 'TennantId', authOptions, function(err, credentials){

        if (err) throw err;
        // This works as it prints the credentials
        context.log(credentials);

        var batch_client = new batch.ServiceClient(credentials, accountUrl);

        batch_client.pool.get('mycluster', function(error, result){

            if(error === null)
            {
                context.log('Accessed pool');
                context.log(result);
            }
            else
            {
                //Request to batch service returns a 401
                if(error.statusCode === 404)
                {
                    context.log('Pool not found yet returned 404...');

                }
                else
                {
                    context.log('Error occurred while retrieving pool data');
                    context.log(error);
                }

                //'Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly.
                context.res = { body: error.body.message.value };
                context.done();
            }
        });
    });
};
于 2020-02-14T20:50:48.933 に答える