如何通过API将当前AAD用户传递给AAS OLAP Cube完成认证
解决AAS OLAP Cube传递AAD用户身份的方案
我明白你的困扰——Impersonator类确实只适配Windows本地的身份模拟场景,在纯Azure AD+云环境的AAS场景下完全派不上用场。结合你的Web API已经用Azure AD认证的情况,给你两个靠谱的方案:
方案一:使用EffectiveUserName属性传递用户身份
这是AAS官方支持的模拟方式,核心是让你的Web API服务主体以当前AAD用户的身份去访问Cube,步骤如下:
给Web API服务主体配置AAS权限
登录Azure门户,找到你的AAS服务器,进入「访问控制(IAM)」或者「角色」(取决于AAS版本):- 添加Web API的服务主体为AAS的「读取者」(或更高权限)角色
- 确保勾选「允许模拟其他用户」的权限(部分AAS角色默认包含这个权限,比如管理员)
在代码中获取当前用户信息并设置EffectiveUserName
因为Web API已经通过Azure AD认证,HttpContext.User里包含了当前用户的AAD声明信息,比如UPN(用户主体名称)或者Object ID。用ADOMD.NET连接AAS时,直接设置这个属性:using Microsoft.AnalysisServices.AdomdClient; // 从当前请求上下文获取用户UPN var userUpn = HttpContext.User.FindFirst(System.Security.Claims.ClaimTypes.Upn)?.Value; if (string.IsNullOrEmpty(userUpn)) { // fallback:用Object ID代替,部分场景下UPN可能不存在 userUpn = HttpContext.User.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier)?.Value; } var aasConnectionString = "Provider=MSOLAP;Data Source=asazure://<region>.asazure.windows.net/<your-aas-server>;"; using var connection = new AdomdConnection(aasConnectionString); // 设置模拟的用户名 connection.EffectiveUserName = userUpn; connection.Open(); // 执行你的Cube查询逻辑 var command = new AdomdCommand("SELECT * FROM [YourCube].[YourMeasureGroup]", connection); using var reader = command.ExecuteReader(); // 处理查询结果...
方案二:直接传递AAD用户的访问令牌
这种方式更符合云原生的身份流转逻辑,Web API获取当前用户针对AAS的委托访问令牌,直接传递给AAS进行身份验证:
配置Web API的AAD权限
登录Azure门户,找到你的Web API的应用注册:- 进入「API权限」,添加「Azure Analysis Services」的委托权限(比如
user_impersonation) - 点击「授予管理员同意」,确保权限生效
- 进入「API权限」,添加「Azure Analysis Services」的委托权限(比如
在代码中获取用户的AAD令牌并传递
使用Azure AD的令牌获取库(比如Microsoft.Identity.Web)来获取用户的委托令牌,然后通过ADOMD.NET的AccessToken属性传递:using Microsoft.AnalysisServices.AdomdClient; using Microsoft.Identity.Web; // 注入ITokenAcquisition服务(来自Microsoft.Identity.Web) private readonly ITokenAcquisition _tokenAcquisition; public YourApiController(ITokenAcquisition tokenAcquisition) { _tokenAcquisition = tokenAcquisition; } public async Task<IActionResult> QueryCube() { // 获取针对AAS资源的用户委托令牌,AAS的资源ID是https://analysis.azure.com/ var accessToken = await _tokenAcquisition.GetAccessTokenForUserAsync( new[] { "https://analysis.azure.com/.default" }); var aasConnectionString = "Provider=MSOLAP;Data Source=asazure://<region>.asazure.windows.net/<your-aas-server>;"; using var connection = new AdomdConnection(aasConnectionString); // 设置用户的访问令牌 connection.AccessToken = accessToken; connection.Open(); // 执行查询逻辑... return Ok(); }
关键注意事项
- 两种方案都不需要依赖Windows的Impersonator类,完全适配云环境
- 方案一需要确保Web API服务主体有AAS的模拟权限,方案二则依赖用户的委托权限流转
- 优先用方案二,因为它更符合Azure AD的身份验证最佳实践,不需要额外配置模拟权限
内容的提问来源于stack exchange,提问作者brechtd
相关产品推荐
相关产品推荐

