簡體   English   中英

Microsoft.AnalysisServices.AdomdClient 在 .Net Core 應用程序中不起作用(身份驗證問題)

[英]Microsoft.AnalysisServices.AdomdClient doesn't work in .Net Core application (Authentication issue)

我在 .Net Core Web API 應用程序中使用 Microsoft.AnalysisServices.AdomdClient.NetCore.retail.amd64 庫時遇到問題。

有趣的事實:相同的代碼在 .Net 4.7.2 應用程序中運行良好,但在 .Net Core 中失敗(目前我正在測試 .Net 5 版本)。

該應用程序具有 Windows 身份驗證(IIS 快速),並使用連接字符串與 Integrated Security=SSPI 參數的分析服務。 在 connection.Open() 方法上我得到一個

身份驗證異常
“無法使用提供的憑據獲取身份驗證令牌”。 內部異常:“MsalServiceException”:返回 url 的聯合服務

錯誤。

代碼:

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

Controller 私有方法:

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 核心上不添加。WithUserName() 因為 MSAL 無法確定當前登錄用戶的用戶名 (UPN)。 請在調用 ExecuteAsync() 之前使用.WithUserName()。 有關詳細信息,請參閱https://github.com/AzureAD/microsoft-authentication-library-for-do.net/wiki/Integrated-Windows-Authentication

貌似.net核心版無法獲取用戶名,用它來獲取Azure token進行分析服務認證。 此外,如果我使用 MSAL 庫獲取令牌,則不清楚如何將令牌與 AdomdClient 庫一起使用。

我已經寫信給圖書館老板,但沒有得到任何回應。

經過調查,我發現 Microsoft.AnalysisServices.AdomdClient.NetCore.retail.amd64 有一些隱藏的依賴關系。 如果將 Microsoft.Identity.Client nuget package 添加到項目中,它會按預期工作。

另一種可能的解決方案 - 不要使用 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 也可以正常工作,您可以毫無問題地查詢表格 model。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM