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

无法将枚举类型属性添加至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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 11:58:12