You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过API将当前AAD用户传递给AAS OLAP Cube完成认证

解决AAS OLAP Cube传递AAD用户身份的方案

我明白你的困扰——Impersonator类确实只适配Windows本地的身份模拟场景,在纯Azure AD+云环境的AAS场景下完全派不上用场。结合你的Web API已经用Azure AD认证的情况,给你两个靠谱的方案:

方案一:使用EffectiveUserName属性传递用户身份

这是AAS官方支持的模拟方式,核心是让你的Web API服务主体以当前AAD用户的身份去访问Cube,步骤如下:

  1. 给Web API服务主体配置AAS权限
    登录Azure门户,找到你的AAS服务器,进入「访问控制(IAM)」或者「角色」(取决于AAS版本):

    • 添加Web API的服务主体为AAS的「读取者」(或更高权限)角色
    • 确保勾选「允许模拟其他用户」的权限(部分AAS角色默认包含这个权限,比如管理员)
  2. 在代码中获取当前用户信息并设置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进行身份验证:

  1. 配置Web API的AAD权限
    登录Azure门户,找到你的Web API的应用注册:

    • 进入「API权限」,添加「Azure Analysis Services」的委托权限(比如user_impersonation)
    • 点击「授予管理员同意」,确保权限生效
  2. 在代码中获取用户的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:46:08