Майкрософт.Услуги по анализу.AdomdClient не работает в приложении .Net Core (проблема с аутентификацией)

#c# #authentication #.net-core #ssas

Вопрос:

У меня проблема с использованием Microsoft.Услуги по анализу.Библиотека AdomdClient.NETCore.retail.amd64 в приложении .Net Core Web API.

Забавный факт: тот же код отлично работает в приложении .Net 4.7.2, но не работает в .Net Core (в настоящее время я тестирую версию .Net 5).

Приложение имеет проверку подлинности Windows (IIS express) и использует строку подключения к службе анализа со встроенным параметром Security=SSPI. При подключении.Метод Open() Я получаю

Исключение проверки подлинности
«Не удалось получить маркер проверки подлинности с использованием предоставленных учетных данных». Внутреннее исключение: «Исключение MsalServiceException»: Возвращена объединенная служба по URL-адресу

ошибка.

Код:

 Startup.cs
services.AddAuthentication(IISDefaults.AuthenticationScheme);
 

Частный метод контроллера:

 private DataTable GetData(string connectionString, string databaseName, string daxQuery, 
    Dictionary<string, string> parameters)
    {
    var dt = new DataTable();
    using(var conn = new AdomdConnection(connectionString))
    {
        //fails here
        conn.Open();
        conn.ChangeDatabase(databaseName);
        using(vad cmd = new AdomdCommand(daxQuery, conn))
        {
            if(parameters.Any())
            {
                foreach(var param in parameters)
                {
                    cmd.Parameters(param.Key, param.Value);
                }
            }
            using (var adapter = AdomDataAdapter(cmd))
            {
                adapter.Fill(dt);
            }
        }
        
        return dt;
    }
}
 

Обновление: Я пробовал тот же код в консольных приложениях.

Приложение .Net 4.7.2 работает так, как ожидалось.

.Net 4 завершается с другой ошибкой:

AcquireTokenByIntegratedWindowsAuth не поддерживается в .net core без добавления .С именем пользователя (), поскольку MSAL не может определить имя пользователя (UPN) текущего пользователя, вошедшего в систему. Пожалуйста, используйте .С именем пользователя() перед вызовом ExecuteAsync(). Для получения более подробной информации см. https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/wiki/Integrated-Windows-Authentication

Похоже, что версия .net core не может получить имя пользователя и использовать его для получения маркера Azure для проверки подлинности службы анализа. Более того, если я использую библиотеку MSAL для получения токена, неясно, как использовать токен с библиотекой AdomdClient.

Я уже написал владельцам библиотек, но не получил никакого ответа.

Ответ №1:

После расследования я обнаружил, что Microsoft.Услуги по анализу.AdomdClient.NETCore.retail.amd64 имеет некоторую скрытую зависимость. Это работает так, как и ожидалось, если вы добавите Microsoft.Идентичность.Клиентский пакет nuget для проекта.

Еще одно возможное решение — не используйте AdomdClient и используйте подключение OleDb:

 using (var con = new OleDbConnection(connectionString))
{
    con.Open();
    con.ChangeDatabase(databaseName);
    using (var cmd = new OleDbCommand(query, con))
    {
        using (OleDbDataAdapter adapter = new OleDbDataAdapter(cmd))
        {
            // Here we should increase timeout because DAX query execution can be bigger than default 30 seconds
            adapter.SelectCommand.CommandTimeout = _timeoutInSeconds;
            adapter.Fill(dt);
        }
    }
    return dt;
}
 

OleDb также работает, вы можете без проблем запрашивать табличную модель.