使用EmbedApiSample生成PowerBI Embed Token时遇AADSTS70002错误
这个AADSTS70002错误我在做PowerBI Embedded集成时碰到过好多次,本质就是你的控制台应用向Azure AD请求令牌时,没有正确传递必填的client_secret或client_assertion参数。下面是几个针对性的排查和修复步骤:
先确认服务主体的凭据是否有效且配置正确
首先去Azure AD的服务主体页面,检查你创建的密钥(client_secret)是否过期,或者有没有在生成时正确复制完整的值(毕竟密钥只在创建时显示一次,丢了就得重新生成)。然后核对控制台应用的配置文件(比如appsettings.json)里的ClientSecret字段,确保没有拼写错误、多余空格或者粘贴了错误的内容。示例配置应该是这样的:"PowerBIConfig": { "ClientId": "你的服务主体Client ID", "ClientSecret": "你的服务主体密钥", "TenantId": "你的Azure租户ID", "WorkspaceId": "PowerBI工作区ID", "ReportId": "要嵌入的报表ID" }检查获取Azure AD令牌的请求格式
如果你是手动构建HTTP请求来获取令牌,一定要确保请求体里包含client_secret参数,并且请求的Content-Type设置为application/x-www-form-urlencoded。正确的请求体示例:grant_type=client_credentials&resource=https://analysis.windows.net/powerbi/api&client_id=你的ClientID&client_secret=你的密钥要是用的是Microsoft.Identity.Client(MSAL)库,检查代码里有没有正确传入凭据。比如用密钥认证的话,代码应该是这样的:
var confidentialClient = ConfidentialClientApplicationBuilder .Create(Configuration["PowerBIConfig:ClientId"]) .WithClientSecret(Configuration["PowerBIConfig:ClientSecret"]) .WithTenantId(Configuration["PowerBIConfig:TenantId"]) .Build(); var authResult = await confidentialClient.AcquireTokenForClient(new[] { "https://analysis.windows.net/powerbi/api/.default" }) .ExecuteAsync();别漏掉
WithClientSecret这一步,很多时候就是这里忘加了导致的错误。别搞混服务主体密钥和用户密码
新手容易犯的一个错误:把Azure AD普通用户的登录密码当成了服务主体的client_secret。记住,服务主体是专门给应用程序用的身份,它的密钥是在服务主体的“证书和密码”选项卡下生成的,和用户账号的密码完全不是一回事。如果用证书认证,要改用client_assertion
要是你的服务主体是用证书来做身份验证的,那你就不能用client_secret,得生成基于证书的client_assertion参数。用MSAL的话,代码应该改成加载证书的方式:var certPath = Path.Combine(Directory.GetCurrentDirectory(), "你的证书文件.pfx"); var certificate = new X509Certificate2(certPath, "证书密码"); var confidentialClient = ConfidentialClientApplicationBuilder .Create(Configuration["PowerBIConfig:ClientId"]) .WithCertificate(certificate) .WithTenantId(Configuration["PowerBIConfig:TenantId"]) .Build();
按照上面的步骤排查,90%以上的情况都能解决这个AADSTS70002错误。如果还是不行,可以再检查一下服务主体的权限是否正确配置(有没有给PowerBI工作区的权限),不过这个错误本身是身份验证阶段的问题,优先解决凭据传递的问题。
内容的提问来源于stack exchange,提问作者Krishnan

