使用繁琐的托管服务标识 (MSI) 将 javascript Azure 函数应用程序与 SQL 服务器连接

时间:2021-07-22 12:21:36

标签: javascript node.js sql-server azure-functions tedious

我正在尝试使用乏味和托管服务标识 (MSI) 将我的 Azure 函数应用连接到托管 SQL 服务器。 首先,我按照这个链接来构建我的函数: https://docs.microsoft.com/fr-fr/azure/azure-sql/database/connect-query-nodejs?tabs=windows https://medium.com/swlh/a-node-function-app-to-get-json-results-from-azure-synapse-analytics-e671dd6ae827

我在数据库中添加了应用程序函数的名称。我使用 Tedious 开发了该功能,并用“azure-active-directory-msi-app-service”填充了 auth 值。 这是我的代码示例:

const { Connection, Request } = require('tedious');

module.exports = function (context, req) {

    // Create array to store the query results
    let result = [];
    let rowData = {};

    const config = {
        server: 'XXXXXX.public.XXXXXX.database.windows.net',
        Authentication: {
            type: 'azure-active-directory-msi-app-service',
        },
        options: {
            database: 'YYYYY',
            encrypt: true,
            port: 3342,
            connectTimeout: 120000
        }
    }

    // Create query to execute against the database
    const queryText = `SQL QUERY`;

    context.log('Query selected : ' + queryText);

    const connection = new Connection(config);

    // Create Request object
    const request = new Request(queryText, (err) => {
        connection.close();
        if (err) {
            // Error in executing query
            context.log.error(err);
            context.res.status = 500;
            context.res.body = 'Error executing the query';
        } else {
            context.res = {
                status: 200,
                isRaw: true,
                body: result,
                headers: {
                    'Content-Type': 'application/json'
                }
            }
        }
        // Inform Azure Function runtime that work is done
        context.done();
    });

    connection.connect();

    // Manipulate the results and create JSON
    request.on('row', function (columns) {
        rowData = {};
        columns.forEach(function (column) {
            rowData[column.metadata.colName] = column.value;
        });
        result.push(rowData);
    });

    // Attempt to connect and execute queries if connection goes through
    connection.on('connect', function (err) {
        if (err) {
            // Error in connecting
            context.log.error(err);
            context.res.status = 500;
            context.res.body = 'Error connecting to Azure SQL server';
            context.done();
        } else {
            // Connection succeeded
            context.log('Connection succeeded');
            connection.execSql(request);
        }
    });
}

我总是收到验证错误:

2021-07-22T12:16:22.925 [Error] ConnectionError: Login failed for user ''.at ConnectionError
(C:\home\site\wwwroot\node_modules\tedious\lib\errors.js:13:12)at Parser.<anonymous> 
(C:\home\site\wwwroot\node_modules\tedious\lib\connection.js:1184:51)at Parser.emit (events.js:315:20)at Readable.<anonymous> 
(C:\home\site\wwwroot\node_modules\tedious\lib\token\token-stream-parser.js:27:14)at Readable.emit (events.js:315:20)at addChunk 
(C:\home\site\wwwroot\node_modules\readable-stream\lib\_stream_readable.js:298:12)at readableAddChunk 
(C:\home\site\wwwroot\node_modules\readable-stream\lib\_stream_readable.js:280:11)at Readable.push 
(C:\home\site\wwwroot\node_modules\readable-stream\lib\_stream_readable.js:241:10)at 
C:\home\site\wwwroot\node_modules\readable-stream\lib\internal\streams\from.js:49:29at Generator.next (<anonymous>) {code: 'ELOGIN'}

你能帮我找出问题出在哪里吗?有没有我没有在 SQL 云上做的额外配置?

提前致谢。

干杯,

1 个答案:

答案 0 :(得分:0)

根据文档,身份验证属性不应大写。由于它没有找到 msi 设置,它默认返回到您尚未设置的用户/密码身份验证。

authentication: {
    type: 'azure-active-directory-msi-app-service',
}