无法将枚举类型属性添加至JWT的Claims中
问题描述
项目中模型类eCulinaryUser包含CookType枚举属性,定义如下:
eCulinaryUser.cs
public class eCulinaryUser { public int Id { get; set; } public CookType CookType { get; set; } public string FirstName { get; set; } = string.Empty; public string LastName { get; set; } = string.Empty; // 其他属性 public DateTime CreatedAt { get; set; } = DateTime.Now; }
CookType.cs
public enum CookType { Hobbyist, Professional }
生成JWT Claims时,通过EF Core查询获取用户对应的eCulinaryUser列表:
var eCulinaryUser=_dbContext.eCulinaryUsers.Where(eu=>eu.UserId==user.Id) .Select(eu=>new eCulinaryUser { CookType=eu.CookType }).ToList();
尝试添加到Claims:
if(eCulinaryUser != null) { claims.Add(new Claim("cooktype", eCulinaryUser.ToString())); }
但JWT中的cooktype Claim值为空,实际eCulinaryUser中已包含正确的CookType值,如何正确添加枚举属性到JWT Claims?
解决方案
1. 修正查询结果类型问题
你当前查询返回的是List<eCulinaryUser>集合,调用ToString()只会得到集合的类型名称(比如System.Collections.Generic.List1[YourNamespace.eCulinaryUser]`),并非枚举值。
如果UserId是唯一标识,应该用FirstOrDefault()获取单个用户对象,而非ToList():
var eCulinaryUser = _dbContext.eCulinaryUsers .Where(eu => eu.UserId == user.Id) .Select(eu => new { eu.CookType }) // 用匿名类型更轻量,无需实例化完整eCulinaryUser .FirstOrDefault();
2. 正确获取枚举的可序列化值
拿到单个用户对象后,有两种方式将枚举转为适合存入Claim的字符串:
- 方式一:存储枚举的字符串名称(推荐,可读性更高)
if (eCulinaryUser != null) { string cookTypeStr = Enum.GetName(typeof(CookType), eCulinaryUser.CookType); claims.Add(new Claim("cooktype", cookTypeStr)); }
- 方式二:存储枚举的整数数值
if (eCulinaryUser != null) { int cookTypeInt = (int)eCulinaryUser.CookType; claims.Add(new Claim("cooktype", cookTypeInt.ToString())); }
3. 完整修改后的代码示例
// 查询单个用户的CookType var culinaryUserCookType = _dbContext.eCulinaryUsers .Where(eu => eu.UserId == user.Id) .Select(eu => eu.CookType) .FirstOrDefault(); // 添加到Claims claims.Add(new Claim("cooktype", Enum.GetName(typeof(CookType), culinaryUserCookType)));
内容的提问来源于stack exchange,提问作者Prabir Choudhury
相关产品推荐
相关产品推荐

