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

如何在隔离模型Azure Function中使用Microsoft.Identity.Web获取PowerBI访问令牌

解决隔离模型Azure Function调用PowerBI Service的认证问题

前置准备

首先安装所需NuGet包:

  • Microsoft.Identity.Web
  • Microsoft.Azure.Functions.Worker
  • Microsoft.Identity.Web.TokenCache

在appsettings.json中添加Azure AD应用注册配置:

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "你的AAD租户ID",
    "ClientId": "应用注册的客户端ID",
    "ClientSecret": "应用注册的客户端机密"
  },
  "PowerBi": {
    "ServiceApiRoot": "https://api.powerbi.com/",
    "DefaultScope": "https://analysis.windows.net/powerbi/api/.default"
  }
}

服务配置(Program.cs)

隔离进程模型Azure Function的服务注册在Program.cs中完成,无需使用Web应用专属的认证中间件,直接配置TokenAcquisition服务即可:

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults()
    .ConfigureServices((context, services) =>
    {
        // 注册ITokenAcquisition服务,支持客户端凭据流获取令牌
        services.AddMicrosoftIdentityWebAppAuthentication(context.Configuration)
            .EnableTokenAcquisitionToCallDownstreamApi()
            .AddInMemoryTokenCaches();
        
        // 可选:将PowerBI配置注册为单例方便调用
        services.AddSingleton(sp =>
        {
            var config = sp.GetRequiredService<IConfiguration>();
            return new PowerBiSettings
            {
                ServiceApiRoot = config["PowerBi:ServiceApiRoot"],
                DefaultScope = config["PowerBi:DefaultScope"]
            };
        });
    })
    .Build();

host.Run();

如果不想引入WebApp认证相关的冗余组件,也可以直接使用更轻量化的客户端凭据注册方式:

services.AddTokenAcquisition()
    .AddInMemoryTokenCaches()
    .Configure<MicrosoftIdentityOptions>(context.Configuration.GetSection("AzureAd"));

Azure Function类实现

隔离模型支持构造函数注入,直接注入ITokenAcquisition即可使用,和Web应用的调用逻辑完全一致:

public class PowerBiFunction
{
    private readonly ITokenAcquisition _tokenAcquisition;
    private readonly PowerBiSettings _powerBiSettings;

    public PowerBiFunction(ITokenAcquisition tokenAcquisition, PowerBiSettings powerBiSettings)
    {
        _tokenAcquisition = tokenAcquisition;
        _powerBiSettings = powerBiSettings;
    }

    [Function("CallPowerBiApi")]
    public async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get")] HttpRequestData req)
    {
        // 获取PowerBI访问令牌
        var accessToken = await _tokenAcquisition.GetAccessTokenForAppAsync(_powerBiSettings.DefaultScope);
        var tokenCredentials = new TokenCredentials(accessToken, "Bearer");
        
        // 初始化PowerBIClient
        using var client = new PowerBIClient(new Uri(_powerBiSettings.ServiceApiRoot), tokenCredentials);
        
        // 后续PowerBI API调用逻辑
        var workspaces = await client.Groups.GetGroupsAsync();
        
        return new OkObjectResult(workspaces);
    }
}

// 配置类定义
public class PowerBiSettings
{
    public string ServiceApiRoot { get; set; }
    public string DefaultScope { get; set; }
}

注意事项

  • 确保AAD应用注册已授予PowerBI Service对应的应用权限,且已完成管理员同意
  • 内存令牌缓存会随Function实例重启清空,属于正常现象,Microsoft.Identity.Web会自动处理令牌刷新和重新获取
  • 生产环境建议替换内存缓存为分布式缓存实现,避免多实例场景下重复获取令牌

内容的提问来源于stack exchange,提问作者Ramon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 08:54:03