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

C#对象初始化时,如何为非空transaction添加Claim

实现条件添加JWT Claim的几种方法

方案一:先构建Claim集合(推荐,逻辑清晰易维护)

先初始化包含必选Claim的列表,再通过条件判断添加可选的Transaction Claim,最后将集合传入ClaimsIdentity:

var claims = new List<Claim>
{
    new Claim(Constants.JWT_CLAIMS_USER_ID, user.Id.ToString())
};

if (transaction != null)
{
    claims.Add(new Claim(Constants.JWT_CLAIMS_TRANSACTION_GUID, transaction.Guid.ToString()));
}

var tokenDescriptor = new SecurityTokenDescriptor
{
    Subject = new ClaimsIdentity(claims),
    IssuedAt = DateTime.UtcNow,
    Issuer = Constants.JWT_ISSUER,
    Expires = DateTime.UtcNow.AddSeconds(_appSettings.JwtTokenExpirationTime),
    SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
};

这种方式可读性强,后续需要添加更多条件Claim时,直接在if块或新增条件分支即可,扩展成本低。

方案二:用LINQ拼接数组(紧凑写法)

在对象初始化器内,利用Concat方法拼接可选Claim数组,无需额外声明集合变量:

var tokenDescriptor = new SecurityTokenDescriptor
{
    Subject = new ClaimsIdentity(
        new[] { new Claim(Constants.JWT_CLAIMS_USER_ID, user.Id.ToString()) }
        .Concat(transaction != null 
            ? new[] { new Claim(Constants.JWT_CLAIMS_TRANSACTION_GUID, transaction.Guid.ToString()) }
            : Array.Empty<Claim>())
    ),
    IssuedAt = DateTime.UtcNow,
    Issuer = Constants.JWT_ISSUER,
    Expires = DateTime.UtcNow.AddSeconds(_appSettings.JwtTokenExpirationTime),
    SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
};

方案三:利用可空元素过滤(C# 8.0+)

在数组中添加可能为null的Claim,再通过Where过滤掉空元素:

var tokenDescriptor = new SecurityTokenDescriptor
{
    Subject = new ClaimsIdentity(new[] {
        new Claim(Constants.JWT_CLAIMS_USER_ID, user.Id.ToString()),
        transaction != null ? new Claim(Constants.JWT_CLAIMS_TRANSACTION_GUID, transaction.Guid.ToString()) : null
    }.Where(c => c != null)!),
    IssuedAt = DateTime.UtcNow,
    Issuer = Constants.JWT_ISSUER,
    Expires = DateTime.UtcNow.AddSeconds(_appSettings.JwtTokenExpirationTime),
    SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
};

注:!运算符用于告诉编译器过滤后不会有null元素,也可以用OfType<Claim>()替代Where(c => c != null)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:30:42