You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置ASP.NET Core Web应用验证ADFS JWT令牌及解决委托流问题

解决ASP.NET Core Web API验证ADFS Client Credentials令牌及On-Behalf-Of流程问题

我帮你梳理下这两个核心问题的解决方案,都是ADFS 2019下的常见配置坑:

一、修复Web API的令牌验证失败问题

你遇到的audience did not match报错,根源是ADFS在Client Credentials流程下返回的令牌,aud字段会自动带上microsoft:identityserver:前缀,而不是你在ADFS里配置的原始Web API标识符。按下面的方式调整配置即可:

1. 修正JwtBearer验证配置

更新你的AddJwtBearer代码,重点是匹配ADFS返回的完整受众值,同时让元数据自动处理Issuer验证(避免手动硬写出错):

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.Authority = "https://MY-ADFS/adfs";
        // 填完整的ADFS OIDC元数据地址,格式一般是:https://你的ADFS服务器/adfs/.well-known/openid-configuration
        options.MetadataAddress = "https://MY-ADFS/adfs/.well-known/openid-configuration";
        // 这里的Audience要和令牌里的aud完全一致,即 microsoft:identityserver:你的Web API标识符
        options.Audience = "microsoft:identityserver:你的Web API标识符";
        options.TokenValidationParameters = new TokenValidationParameters
        {
            // 直接指定正确的受众列表,包含带前缀的版本
            ValidAudiences = new List<string>
            {
                "microsoft:identityserver:你的Web API标识符"
            },
            // 开启Issuer验证,让Authority自动从元数据获取合法Issuer,不要手动写死
            ValidateIssuer = true,
            ValidateAudience = true
        };
    });

2. 确保中间件顺序正确

在Program.cs(或旧版的Startup.cs)中,必须先启用认证中间件,再启用授权中间件,否则验证逻辑不会生效:

app.UseAuthentication();
app.UseAuthorization();

二、解决On-Behalf-Of流程的客户端ID前缀问题

你调用AcquireTokenAsync时遇到的“找不到客户端ID”错误,是因为ADFS在OBO流程中只识别不带前缀的原始客户端ID,但你传递了带前缀的版本。按以下步骤调整:

1. 正确构造ClientCredential

直接使用ADFS应用组里配置的原始客户端ID(不带microsoft:identityserver:前缀)创建凭证:

// 注意:这里用你在ADFS上配置的原始客户端ID,不要加前缀
ClientCredential clientCredential = new ClientCredential("你的Web API客户端ID", "你的客户端密钥");

2. 无需修改UserAssertion的令牌内容

Web API收到的令牌aud带前缀是正常的,直接用这个令牌创建UserAssertion即可。ADFS会自动验证该令牌的合法性,只要你的Web API在ADFS应用组中被正确配置为允许委托(ActAs)访问最终资源。

3. 确认ADFS应用组的委托配置

最后检查ADFS应用组的设置:

  • 确保你的Web API(作为客户端)被授予了访问最终资源的权限
  • 在Web API的信任关系配置中,启用ActAs权限(允许它代表调用方获取最终资源的令牌)

几个关键提醒

  • Client Credentials流程下,ADFS返回的aud字段格式是固定的microsoft:identityserver:<资源标识符>,这是ADFS 2019的默认行为,不要尝试修改这个规则,而是在验证逻辑中适配它
  • 测试时一定要用jwt.io解析Postman获取的令牌,确认iss、aud、exp等字段是否符合预期,再针对性调整验证参数
  • 元数据地址必须是完整的HTTPS URL,ADFS不会接受相对路径的元数据地址

内容的提问来源于stack exchange,提问作者Loris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:43:57