如何从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,后续再针对这类自定义类型编写处理逻辑
期望的映射示例
比如数据库中存储以下记录:
| Id | UserId | Type | Value |
|---|---|---|---|
| 5 | 1 | Country | United States |
| 6 | 1 | MobilePhone | +11234567890 |
期望代码自动完成如下映射:
// 等效于直接使用ClaimTypes.Country authClaims.Add(new Claim(ClaimTypes.Country, "United States")); // 等效于直接使用ClaimTypes.MobilePhone authClaims.Add(new Claim(ClaimTypes.MobilePhone, "+11234567890"));
内容的提问来源于stack exchange,提问作者Laki Politis
相关产品推荐
相关产品推荐

