如何在ASP.NET的Claims Identity中去除重复声明?
去除ASP.NET Claims重复项的实用办法
方法一:添加前检查Claim是否已存在
在每次添加Claim前,先判断当前ClaimsIdentity里有没有相同类型和值的Claim,直接避免重复插入。修改你的代码如下:
var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme); foreach (Delegation d in delegations) { List<string> delegateRoles = await (from r in _dbContext.Roles where (del.DelegatedId == user.UserId) select r.RoleName).Distinct().ToListAsync(); foreach (string role in delegateRoles) { // 新增判断:只有角色存在且未添加过该Claim时才执行添加 if (DelegatorUserRoles.Contains(role) && !identity.HasClaim("DelegatedRole", role)) { identity.AddClaim(new Claim("DelegatedRole", role)); } } }
核心逻辑是利用ClaimsIdentity.HasClaim()方法做前置校验,确保同一角色只添加一次。
方法二:先收集去重再批量添加
如果Delegation数量较多,这种方法效率更高——用HashSet自动去重的特性,先把所有符合条件的角色收集起来,最后一次性添加:
var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme); var uniqueDelegatedRoles = new HashSet<string>(); foreach (Delegation d in delegations) { List<string> delegateRoles = await (from r in _dbContext.Roles where (del.DelegatedId == user.UserId) select r.RoleName).Distinct().ToListAsync(); foreach (string role in delegateRoles) { if (DelegatorUserRoles.Contains(role)) { uniqueDelegatedRoles.Add(role); // HashSet自动忽略重复值 } } } // 批量添加去重后的角色 foreach (var role in uniqueDelegatedRoles) { identity.AddClaim(new Claim("DelegatedRole", role)); }
方法三:LINQ整合筛选与去重(更简洁)
如果业务逻辑允许,用LINQ把所有筛选、去重逻辑整合到一起,代码更紧凑:
var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme); // 一次性获取所有符合条件的去重角色 var allValidRoles = await delegations .SelectMany(async d => (from r in _dbContext.Roles where (del.DelegatedId == user.UserId) select r.RoleName).Distinct() ) .SelectMany(roles => roles) .Where(role => DelegatorUserRoles.Contains(role)) .Distinct() .ToListAsync(); // 批量添加Claims foreach (var role in allValidRoles) { identity.AddClaim(new Claim("DelegatedRole", role)); }
内容的提问来源于stack exchange,提问作者user18363545
相关产品推荐
相关产品推荐

