能否在Duende Identity Server 5的身份令牌中设置布尔类型声明?
问题
在Duende Identity Server 5.2.3中设置自定义声明时,该声明已成功添加,但当前为字符串类型而非布尔类型。注意到JWT中存在布尔类型的声明(如email_verified),想了解是否可以将自定义声明也设置为布尔类型,使其在令牌负载中的序列化形式与email_verified一致。
相关代码:
public class CustomTokenService : DefaultTokenService { public override async Task<Token> CreateIdentityTokenAsync(TokenCreationRequest request) { var token = await base.CreateIdentityTokenAsync(request); bool isThisInAGracePeriod = true; // 示例值 // 无直接接收布尔值的构造函数,此写法无效 // var myClaim = new Claim("in_grace_period", isThisInAGracePeriod); // 需将布尔值转为字符串 var myClaim = new Claim("in_grace_period", isThisInAGracePeriod.ToString()); token.Claims.Add(myClaim); } }
当前JWT表现:
email_verified是布尔类型值in_grace_period是字符串类型值(因调用ToString()转换)
解决方案
可以通过指定Claim的ValueType为ClaimValueType.Boolean,让JWT序列化器将自定义声明处理为布尔类型,具体修改如下:
public class CustomTokenService : DefaultTokenService { public override async Task<Token> CreateIdentityTokenAsync(TokenCreationRequest request) { var token = await base.CreateIdentityTokenAsync(request); bool isThisInAGracePeriod = true; // 指定Claim的ValueType为Boolean类型 var myClaim = new Claim("in_grace_period", isThisInAGracePeriod.ToString(), ClaimValueType.Boolean); token.Claims.Add(myClaim); return token; // 补充原代码遗漏的return语句,返回生成的Token } }
原理说明
Duende Identity Server默认使用的JWT序列化组件会读取Claim.ValueType属性:
- 当
ValueType设置为ClaimValueType.Boolean时,序列化器会自动将字符串形式的"True"/"False"转换为JSON布尔值(true/false) - 系统内置的
email_verified声明正是通过这种方式设置了正确的ValueType,因此呈现为布尔类型
修改后,JWT负载中的in_grace_period会以布尔值形式存在:
"in_grace_period": true
内容的提问来源于stack exchange,提问作者Learning AWS and PostgreSQL
相关产品推荐
相关产品推荐

