实现Power BI对接.NET 6 WebAPI的身份验证流程
问题场景
我基于.NET 6开发的Web API部署在Azure App Service,已配置Azure AD企业应用和应用注册,支持组织内用户认证。React前端调用一切正常,但Power BI调用API时出现认证错误。
初始错误与第一次调整
最初的认证配置:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"));
此时Power BI登录时提示:
We were unable to connect because this credential type isn't supported for this resource. Please choose another credential type.
我判断是未认证请求未返回正确的WWW-Authenticate头,于是添加了OnChallenge事件来返回authorization_uri:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(options => { builder.Configuration.Bind("AzureAd", options); options.Events = new JwtBearerEvents { OnChallenge = async context => { context.HttpContext.Response.StatusCode = 401; context.HttpContext.Response.Headers.Add("WWW-Authenticate", $"Bearer authorization_uri=\"https://login.microsoftonline.com/{TENANT_ID}/oauth2/authorize?client_id={APP_ID}\""); } }; }, options => { builder.Configuration.Bind("AzureAd", options); } );
新错误:AADSTS500011
调整后Power BI抛出新错误:
invalid_resource: AADSTS500011: The resource principal named https://{WEBAPI_URL}.azurewebsites.net was not found in the tenant named {TENANT NAME}. This can happen if the application has not been installed by the administrator of the tenant or consented to by any user in the tenant. You might have sent your authentication request to the wrong tenant.
实际应用已部署,管理员也完成了企业应用安装,但问题依旧,需要排查以下配置:
排查与修复步骤
核对API应用注册的标识符
- 登录Azure门户,找到API对应的应用注册,检查应用程序ID URI是否为
https://{WEBAPI_URL}.azurewebsites.net。Power BI请求中的resource参数必须和这个值完全匹配。 - 如果之前用客户端ID作为audience,要么在Power BI连接时指定客户端ID为资源,要么在应用注册的“公开API”页面添加
https://{WEBAPI_URL}.azurewebsites.net作为有效标识符。
- 登录Azure门户,找到API对应的应用注册,检查应用程序ID URI是否为
确认企业应用(服务主体)状态
- 在Azure AD的企业应用中,搜索API应用注册的名称或客户端ID,确认服务主体存在。如果不存在,回到应用注册页面,重新授予管理员同意触发服务主体创建。
- 检查应用注册的“API权限”页面,确保管理员已同意所需权限(至少包含默认的
User.Read)。
修正API的Audience配置
- 打开
appsettings.json,确保AzureAd节的Audience值与应用注册的标识符一致:"AzureAd": { "Instance": "https://login.microsoftonline.com/", "TenantId": "{你的租户ID}", "ClientId": "{API的应用ID}", "Audience": "https://{WEBAPI_URL}.azurewebsites.net" } - 这个值必须和Power BI请求的resource完全匹配,否则JWT验证会失败。
- 打开
完善OnChallenge事件的授权URI
- 当前的
authorization_uri缺少resource参数,Power BI需要明确知道要请求哪个资源的令牌,修改头信息:context.HttpContext.Response.Headers.Add("WWW-Authenticate", $"Bearer authorization_uri=\"https://login.microsoftonline.com/{TENANT_ID}/oauth2/authorize?client_id={APP_ID}&resource=https://{WEBAPI_URL}.azurewebsites.net\""); - 确保
resource值和应用注册的标识符一致。
- 当前的
检查Power BI连接设置
- 在Power BI连接API时,选择OAuth2认证方式,输入的资源URL必须和API应用注册的标识符完全一致。如果用客户端ID作为资源,就填客户端ID而非API的URL。
内容的提问来源于stack exchange,提问作者Coxy

