public async Task UpdateClaimsAsync(User user, IEnumerable <Claim> claims) { var existingClaims = (await _userManager.GetClaimsAsync(user.Id)).ToList(); var list = claims as IList <Claim> ?? claims.ToList(); var newClaims = list.Where(claim => existingClaims.All(c => c.Type != claim.Type)); var updatedClaims = list.Where(claim => existingClaims.Any(c => c.Type == claim.Type && c.Value != claim.Value)); foreach (var newClaim in newClaims) { await _userManager.AddClaimAsync(user.Id, newClaim); } foreach (var updatedClaim in updatedClaims) { var existing = existingClaims.First(c => c.Type == updatedClaim.Type); await _userManager.RemoveClaimAsync(user.Id, existing); await _userManager.AddClaimAsync(user.Id, updatedClaim); } }
public async Task <IActionResult> UpdateClaims([FromBody] ClaimsDto entity) { var user = await _userManager.FindByIdAsync(entity.UserId); if (user == null) { return(NotFound()); } var removeClaims = new List <UserClaim>(); foreach (var claim in user.Claims ?? new List <UserClaim>()) { if (claim.Type != JwtClaimTypes.Subject || claim.Type != JwtClaimTypes.Role) { continue; } if (!entity.Claims.Contains(claim.Value, StringComparer.OrdinalIgnoreCase)) { removeClaims.Add(claim); } } foreach (var claim in removeClaims) { await _userManager.RemoveClaimAsync(user, claim); } foreach (string newClaim in entity.Claims) { if (!user.Claims.Any(tbl => (tbl.Type == JwtClaimTypes.Role || tbl.Type == JwtClaimTypes.Subject) && tbl.Value.ToLower() == newClaim.ToLower())) { await _userManager.AddClaimAsync(user, new UserClaim(JwtClaimTypes.Role, newClaim)); } } // clean after // converting subs to roles, and reserving sub for user id var swapClaims = new List <UserClaim>(); var dupeClaims = new List <UserClaim>(); foreach (var c in user.Claims ?? new List <UserClaim>()) { if (c.Type == JwtClaimTypes.Subject) { if (user.Claims.Any(claim => (claim.Type == JwtClaimTypes.Role && claim.Value == c.Value))) { dupeClaims.Add(c); } else { swapClaims.Add(c); } } } // Remove dupes foreach (var claim in dupeClaims) { await _userManager.RemoveClaimAsync(user, claim); } // Add swap claims foreach (var claim in swapClaims) { await _userManager.AddClaimAsync(user, new UserClaim(JwtClaimTypes.Role, claim.Value)); } return(Ok(entity)); }
public async Task <IdentityResult> AddClaimAsync(User user, Claim claim) { return(await _userManager.AddClaimAsync(user, claim)); }