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

.NET Core中Keycloak JWT访问令牌aud受众如何完成验证?

.NET Core JWT受众验证逻辑与Keycloak适配说明

你当前令牌aud字段异常的原因

Keycloak签发的JWT中aud(受众)字段,标记的是该令牌被授权访问的资源端列表。你现在拿到的aud只有realm-management和account两个值,是Keycloak的内置客户端标识,分别对应域管理接口、用户自助账号管理接口,和你的自定义.NET Core API没有关系。出现这个问题的核心原因是你给Angular应用配置的Keycloak客户端,没有将后端API对应的客户端加入令牌受众列表,属于Keycloak的常见配置漏项。

ValidateAudience=true的执行流程

当你在JWT Bearer认证中开启ValidateAudience = true,认证管线会按固定顺序执行校验:

  • 先完成前置校验:验证令牌签名是否合法、是否在有效期内、令牌签发人(iss)是否匹配Keycloak服务地址
  • 解析令牌payload中的aud字段,无论字段是单个字符串还是字符串数组,都会统一转换为集合处理
  • 将令牌携带的aud集合,和服务端预设的合法受众集合做匹配:只要令牌aud中存在任意一个值在合法受众集合内,受众校验就通过;如果没有任何匹配项,直接判定认证失败,触发你配置的OnAuthenticationFailed回调。

默认配置下的比对基准值

你当前的代码只开启了受众校验开关,没有手动指定合法受众,这时候校验逻辑用来做比对的合法值只有两个来源:

  • TokenValidationParameters.ValidAudience配置的单个合法受众值(你未配置时为null)
  • TokenValidationParameters.ValidAudiences配置的合法受众集合(你未配置时为空集合)

注意:JWT Bearer认证不会自动从你配置的Keycloak元数据地址拉取合法受众列表,元数据端点仅用来获取令牌签名公钥、签发人信息这类基础配置,受众值需要手动指定

也就是说你当前的配置是不完整的:既没有指定服务端认可的合法受众,Keycloak签发的令牌里也没有对应你后端API的aud值,实际运行时会直接返回认证失败,无法正常通过校验。

正确配置方法

  1. 调整Keycloak侧配置,让签发的令牌带上后端API对应的aud值
    • 进入Keycloak管理控制台,找到Angular应用使用的客户端,打开「客户端作用域」标签
    • 进入该客户端自动生成的专属作用域(命名格式一般是[Angular客户端ID]-dedicated),切换到「作用域」标签
    • 新增一个「受众」类型的映射器,选择你.NET Core API对应的Keycloak客户端作为目标受众,保存配置
    • 重新登录Angular应用获取新令牌,就能看到aud数组里已经包含了后端API的客户端ID
  2. 调整.NET Core侧JWT配置,指定合法受众
o.TokenValidationParameters = new TokenValidationParameters()
{
    ValidateAudience = true,
    // 填入你Keycloak中.NET API对应的客户端ID,也就是上一步加到aud里的值
    ValidAudiences = new[] { "your-dotnet-api-client-id" }
};

配置完成后,只有明确签发来访问你后端API的令牌才能通过校验,避免原本发给Keycloak内置接口的令牌被越权用来调用业务接口。


内容的提问来源于stack exchange,提问作者Anil P Babu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 10:57:54