.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值,实际运行时会直接返回认证失败,无法正常通过校验。
正确配置方法
- 调整Keycloak侧配置,让签发的令牌带上后端API对应的aud值
- 进入Keycloak管理控制台,找到Angular应用使用的客户端,打开「客户端作用域」标签
- 进入该客户端自动生成的专属作用域(命名格式一般是
[Angular客户端ID]-dedicated),切换到「作用域」标签 - 新增一个「受众」类型的映射器,选择你.NET Core API对应的Keycloak客户端作为目标受众,保存配置
- 重新登录Angular应用获取新令牌,就能看到aud数组里已经包含了后端API的客户端ID
- 调整.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
相关产品推荐
相关产品推荐

