#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 также работает, вы можете без проблем запрашивать табличную модель.