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
相关产品推荐
相关产品推荐

