.Net Core应用中Microsoft.AnalysisServices.AdomdClient认证失败问题咨询
.NET Core 下 AdomdClient 连接 Analysis Services 集成认证问题解决方案
问题根因
.NET Core 版本的 AdomdClient 底层依赖 MSAL 库实现 Windows 集成认证,MSAL 在 .NET Core 运行时下无法自动获取当前登录用户的用户主体名(UPN),导致内置的集成认证逻辑失效,而 .NET Framework 下的实现无此限制。
解决方案步骤
1. 调整连接字符串
移除原有连接字符串中的 Integrated Security=SSPI 配置,仅保留服务地址配置即可,示例:
Data Source=asazure://<区域>.asazure.chinacloudapi.cn/<你的AS实例名>;
2. 安装依赖包
安装 MSAL 官方 NuGet 包用于手动获取认证令牌:Install-Package Microsoft.Identity.Client
3. 手动获取认证令牌
从 IIS Windows 认证上下文拿到当前用户的 UPN,调用 MSAL 接口获取访问令牌:
// 从控制器HttpContext中获取当前用户标识 var userName = HttpContext.User.Identity.Name; // 转换域\用户名格式为UPN格式(如果返回的是域\账号格式) if (userName.Contains("\\")) { var domainPart = userName.Split('\\')[0]; var accountPart = userName.Split('\\')[1]; userName = $"{accountPart}@{domainPart}.com"; // 按企业实际域名后缀调整 } // 构造MSAL客户端获取令牌 var app = PublicClientApplicationBuilder .Create("<你的应用客户端ID,Azure AS场景下可使用通用客户端ID:cf034d42-6b65-4ed4-9420-95991b4875c2>") .WithAuthority("https://login.microsoftonline.com/<你的租户ID>") .Build(); // 本地SSAS场景修改为对应服务的scope var scopes = new[] { "https://*.asazure.chinacloudapi.cn/.default" }; var result = await app.AcquireTokenByIntegratedWindowsAuth(scopes) .WithUsername(userName) .ExecuteAsync(); var accessToken = result.AccessToken;
4. 传入令牌到AdomdConnection
调用 AdomdConnection 内置的 SetAccessToken 方法传入令牌,再执行打开连接操作,修复后的业务代码如下:
private DataTable GetData(string connectionString, string databaseName, string daxQuery, Dictionary<string, string> parameters, string accessToken) { var dt = new DataTable(); using(var conn = new AdomdConnection(connectionString)) { // 传入手动获取的令牌,替代内置认证逻辑 conn.SetAccessToken(accessToken); conn.Open(); conn.ChangeDatabase(databaseName); using(var cmd = new AdomdCommand(daxQuery, conn)) { if(parameters.Any()) { foreach(var param in parameters) { cmd.Parameters.Add(param.Key, param.Value); } } using (var adapter = new AdomdDataAdapter(cmd)) { adapter.Fill(dt); } } return dt; } }
注意事项
- 确保IIS配置中仅开启Windows身份认证,关闭匿名认证,否则无法获取当前登录用户的身份信息
- 本地部署SSAS场景下,调整MSAL的权限范围、授权地址为对应本地ADFS配置即可
内容的提问来源于stack exchange,提问作者Oblomingo
相关产品推荐
相关产品推荐

