You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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);
}

遇到的具体问题

  1. 用API自身的范围时的错误
    当我用api:/{APIclientId}/.default作为请求范围时,Worker这边获取令牌时直接抛出了异常,错误信息是:

AADSTS1100001: Non-retryable error has occurred. Underlying error code: 1003003.

而且这个请求根本打不到我在API的JWT中间件里设的断点,说明请求连API的认证环节都没进入。

  1. 改用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?麻烦各位帮忙排查一下可能的问题点,谢谢!

火山引擎 最新活动