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

能否在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 14:36:18