如何在隔离模型Azure Function中使用Microsoft.Identity.Web获取PowerBI访问令牌
解决隔离模型Azure Function调用PowerBI Service的认证问题
前置准备
首先安装所需NuGet包:
Microsoft.Identity.WebMicrosoft.Azure.Functions.WorkerMicrosoft.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
相关产品推荐
相关产品推荐

