【问题标题】:Microsoft.AnalysisServices.AdomdClient doesn't work in .Net Core application (Authentication issue)Microsoft.AnalysisServices.AdomdClient 在 .Net Core 应用程序中不起作用(身份验证问题)
【发布时间】:2021-10-31 02:12:45
【问题描述】:

我在 .Net Core Web API 应用程序中使用 Microsoft.AnalysisServices.AdomdClient.NetCore.retail.amd64 库时遇到问题。

有趣的事实:相同的代码在 .Net 4.7.2 应用程序中运行良好,但在 .Net Core 中失败(目前我正在测试 .Net 5 版本)。

该应用具有 Windows 身份验证 (IIS express),并使用带有集成安全 = SSPI 参数的分析服务的连接字符串。 在 connection.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 失败并出现不同的错误:

在不添加 .WithUserName() 的情况下,.net 核心不支持 AcquireTokenByIntegratedWindowsAuth,因为 MSAL 无法确定当前登录用户的用户名 (UPN)。请在调用 ExecuteAsync() 之前使用 .WithUserName()。更多详情见https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/wiki/Integrated-Windows-Authentication

.net core 版本似乎无法获取用户名并使用它来获取 Azure 令牌以进行分析服务身份验证。此外,如果我使用 MSAL 库来获取令牌,则不清楚如何将令牌与 AdomdClient 库一起使用。

我已经写信给图书馆所有者,但没有得到任何回复。

【问题讨论】:

    标签: c# authentication .net-core ssas


    【解决方案1】:

    经过调查,我发现 Microsoft.AnalysisServices.AdomdClient.NetCore.retail.amd64 有一些隐藏的依赖关系。如果您将 Microsoft.Identity.Client 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 也可以,你可以毫无问题地查询表格模型。

    【讨论】:

      猜你喜欢
      • 2020-11-05
      • 2020-06-20
      • 2020-02-24
      • 2017-12-19
      • 2019-10-30
      • 2018-07-13
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      相关资源
      最近更新 更多