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

如何从SQL存储的字符串动态映射ClaimTypes类型

问题:自动映射UserClaims到System.Security.Claims.ClaimTypes

背景

  • 数据库存在UserClaims表,字段包括:Id(int)、UserId(int,外键关联User表的Id)、Type(nvarchar)、Value(nvarchar)
  • 当前使用Dapper读取该表数据

需求

获取特定用户的UserClaims时,实现自动映射能力:当数据库中Type字段的值与System.Security.Claims.ClaimTypes静态类的字段名匹配时,自动使用对应的ClaimTypes常量创建Claim对象;不匹配则创建自定义类型的Claim。无需手动逐个添加switch或if判断,让代码具备扩展性,后续新增ClaimTypes中的类型时无需修改映射逻辑。

当前无法正常工作的代码

foreach(var c in user.UserClaims)
{
    if (!String.IsNullOrEmpty(c.Value) && !String.IsNullOrEmpty(c.Type))
    {
        if (c.Type == "Role")
            authClaims.Add(new Claim(ClaimTypes.Role, c.Value));
        else
        {
            var _type = typeof(ClaimTypes);
            var field = _type?.GetField(c.Type);

            if (field != null)
                authClaims.Add(new Claim(field, c.Value));
            else
                authClaims.Add(new Claim(c.Type, c.Value));
        }
    }
}

逻辑说明

  • 若数据库返回的Type匹配ClaimTypes中的字段名,就用该字段对应的标准Claim类型创建Claim
  • 不匹配则创建自定义类型的Claim,后续再针对这类自定义类型编写处理逻辑

期望的映射示例

比如数据库中存储以下记录:

IdUserIdTypeValue
51CountryUnited States
61MobilePhone+11234567890

期望代码自动完成如下映射:

// 等效于直接使用ClaimTypes.Country
authClaims.Add(new Claim(ClaimTypes.Country, "United States"));
// 等效于直接使用ClaimTypes.MobilePhone
authClaims.Add(new Claim(ClaimTypes.MobilePhone, "+11234567890"));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 10:07:36