Worker Service使用Entra客户端凭据调用受保护API时遭遇AADSTS1100001等错误的解决咨询
Worker Service使用Entra客户端凭据调用受保护API时遭遇AADSTS1100001等错误的解决咨询
各位好,我现在卡在了用Worker Service通过Entra客户端凭据调用自己的受保护API的问题上,想请大家帮忙看看哪里出了问题。
已完成的前置配置
我已经做了这些准备工作:
- 给目标API的应用注册添加了应用角色
- 在Worker Service的应用注册里,添加了对应API应用角色的权限,并且已经完成了管理员权限同意
- API这边配置了外部身份的用户流,会在请求到达JWT中间件前,给认证票据自动添加系统用户ID和角色
Worker Service的核心实现代码
首先是服务注册部分,我把IConfidentialClientApplication注册成了单例:
var builder = Host.CreateApplicationBuilder(args); var clientId = builder.Configuration["AzureAd:ClientId"]; var tenantId = builder.Configuration["AzureAd:TenantId"]; var clientSecret = builder.Configuration["AzureAd:ClientSecret"]; var app = ConfidentialClientApplicationBuilder.Create(clientId) .WithClientSecret(clientSecret) .WithAuthority(new Uri("https://{mytenant}.ciamlogin.com/{tenantId}/v2.0")) .Build(); builder.Services.AddSingleton<IConfidentialClientApplication>(app);
然后在Worker的ExecuteAsync方法里,我通过AcquireTokenForClient获取令牌,再附加到请求头里:
try { _myScope = ["api:/{APIclientId}/.default"]; var header = (await _confidentialClientApp.AcquireTokenForClient(_myScope) .ExecuteAsync(cancellationToken)).AccessToken; _httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", header); } catch(Exception ex) { throw new HttpRequestException("Failed to acquire access token", ex); }
遇到的具体问题
- 用API自身的范围时的错误
当我用api:/{APIclientId}/.default作为请求范围时,Worker这边获取令牌时直接抛出了异常,错误信息是:
AADSTS1100001: Non-retryable error has occurred. Underlying error code: 1003003.
而且这个请求根本打不到我在API的JWT中间件里设的断点,说明请求连API的认证环节都没进入。
- 改用Graph范围时的错误
我试着把范围改成https://graph.microsoft.com/.default,这次Worker能成功获取到令牌,请求也能触发API中间件的断点,但又遇到了新的签名验证错误:
IDX10511: Signature validation failed.
额外尝试的操作
因为API里大部分控制器都是面向用户的,我专门给客户端凭据的请求加了单独的授权策略:
builder.Services.AddAuthorization(o => { o.FallbackPolicy = o.DefaultPolicy; o.AddPolicy("ClientCredentialsPolicy", policy => { policy.RequireRole("API.ReadWrite"); }); });
然后在对应的控制器上应用了这个策略:
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme, Policy = "ClientCredentialsPolicy")]
但这个配置并没有解决之前的问题。
现在我想请教的是:到底该怎么正确配置,才能让Worker Service通过客户端凭据成功调用我的受保护API?麻烦各位帮忙排查一下可能的问题点,谢谢!




