Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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));
        }
Ejemplo n.º 3
0
 public async Task <IdentityResult> AddClaimAsync(User user, Claim claim)
 {
     return(await _userManager.AddClaimAsync(user, claim));
 }