Esempio n. 1
0
        public async Task <IActionResult> DeleteRole(string id)
        {
            if (!await accountManager.TestCanDeleteRoleAsync(id))
            {
                return(BadRequest("Role cannot be deleted. Remove all users from this role and try again"));
            }

            RoleViewModel    roleViewModel   = null;
            IApplicationRole applicationRole = await accountManager.GetRoleByIdAsync(id);

            if (applicationRole != null)
            {
                roleViewModel = await FetchRoleViewModel(applicationRole.Name);
            }

            if (roleViewModel == null)
            {
                return(NotFound(id));
            }

            Tuple <bool, string[]> result = await accountManager.DeleteRoleAsync(applicationRole);

            if (!result.Item1)
            {
                throw new Exception("The following errors occurred whilst deleting role: " + string.Join(", ", result.Item2));
            }

            return(Ok(roleViewModel));
        }
Esempio n. 2
0
        public async Task <IActionResult> CreateRole([FromBody] RoleViewModel role)
        {
            if (ModelState.IsValid)
            {
                if (role == null)
                {
                    return(BadRequest($"{nameof(role)} cannot be null"));
                }

                IApplicationRole applicationRole = Mapper.Map <ApplicationRole>(role);

                Tuple <bool, string[]> result = await accountManager.CreateRoleAsync(applicationRole, role.Permissions?.Select(p => p.Value).ToArray());

                if (result.Item1)
                {
                    RoleViewModel roleViewModel = await FetchRoleViewModel(applicationRole.Name);

                    return(CreatedAtAction(GetRoleByIdActionName, new { id = roleViewModel.Id }, roleViewModel));
                }

                AddErrors(result.Item2);
            }

            return(BadRequest(ModelState));
        }
Esempio n. 3
0
        public async Task <IActionResult> UpdateRole(string id, [FromBody] RoleViewModel role)
        {
            if (ModelState.IsValid)
            {
                if (role == null)
                {
                    return(BadRequest($"{nameof(role)} cannot be null"));
                }

                if (!string.IsNullOrWhiteSpace(role.Id) && id != role.Id)
                {
                    return(BadRequest("Conflicting role id in parameter and model data"));
                }

                IApplicationRole applicationRole = await accountManager.GetRoleByIdAsync(id);

                if (applicationRole == null)
                {
                    return(NotFound(id));
                }

                Mapper.Map(role, applicationRole as ApplicationRole);

                Tuple <bool, string[]> result = await accountManager.UpdateRoleAsync(applicationRole, role.Permissions?.Select(p => p.Value).ToArray());

                if (result.Item1)
                {
                    return(NoContent());
                }

                AddErrors(result.Item2);
            }
            return(BadRequest(ModelState));
        }
Esempio n. 4
0
        public async Task <Tuple <bool, string[]> > UpdateRoleAsync(IApplicationRole role, IEnumerable <string> claims)
        {
            if (claims != null)
            {
                string[] invalidClaims = claims.Where(claim => AuthorizationManager.GetByValue(claim) == null).ToArray();
                if (invalidClaims.Any())
                {
                    return(Tuple.Create(false, new[] { "The following claim types are invalid: " + string.Join(", ", invalidClaims) }));
                }
            }

            var result = await roleManager.UpdateAsync(role as ApplicationRole);

            if (!result.Succeeded)
            {
                return(Tuple.Create(false, result.Errors.Select(e => e.Description).ToArray()));
            }


            if (claims != null)
            {
                var roleClaims      = (await roleManager.GetClaimsAsync(role as ApplicationRole)).Where(c => c.Type == ApplicationClaimType.Authorization);
                var roleClaimValues = roleClaims.Select(c => c.Value).ToArray();

                var claimsToRemove = roleClaimValues.Except(claims).ToArray();
                var claimsToAdd    = claims.Except(roleClaimValues).Distinct().ToArray();

                if (claimsToRemove.Any())
                {
                    foreach (string claim in claimsToRemove)
                    {
                        result = await roleManager.RemoveClaimAsync(role as ApplicationRole, roleClaims.Where(c => c.Value == claim).FirstOrDefault());

                        if (!result.Succeeded)
                        {
                            return(Tuple.Create(false, result.Errors.Select(e => e.Description).ToArray()));
                        }
                    }
                }

                if (claimsToAdd.Any())
                {
                    foreach (string claim in claimsToAdd)
                    {
                        result = await roleManager.AddClaimAsync(role as ApplicationRole, new Claim(ApplicationClaimType.Authorization, AuthorizationManager.GetByValue(claim)));

                        if (!result.Succeeded)
                        {
                            return(Tuple.Create(false, result.Errors.Select(e => e.Description).ToArray()));
                        }
                    }
                }
            }

            return(Tuple.Create(true, new string[] { }));
        }
Esempio n. 5
0
        private async Task <RoleViewModel> FetchRoleViewModel(string roleName)
        {
            IApplicationRole role = await accountManager.GetRoleLoadRelatedAsync(roleName);

            if (role != null)
            {
                return(Mapper.Map <RoleViewModel>(role));
            }
            return(null);
        }
Esempio n. 6
0
        public async Task <Tuple <bool, string[]> > CreateRoleAsync(IApplicationRole role, IEnumerable <string> claims)
        {
            if (claims == null)
            {
                claims = new string[] { };
            }

            string[] invalidClaims = claims.Where(claim => AuthorizationManager.GetByValue(claim) == null).ToArray();
            if (invalidClaims.Any())
            {
                return(Tuple.Create(false, new[] { "The following claim types are invalid: " + string.Join(", ", invalidClaims) }));
            }


            var result = await roleManager.CreateAsync(role as ApplicationRole);

            if (!result.Succeeded)
            {
                return(Tuple.Create(false, result.Errors.Select(error => error.Description).ToArray()));
            }


            role = await roleManager.FindByNameAsync(role.Name);

            foreach (string claim in claims.Distinct())
            {
                result = await roleManager.AddClaimAsync(role as ApplicationRole, new Claim(ApplicationClaimType.Authorization, AuthorizationManager.GetByValue(claim)));

                if (!result.Succeeded)
                {
                    await DeleteRoleAsync(role);

                    return(Tuple.Create(false, result.Errors.Select(e => e.Description).ToArray()));
                }
            }

            return(Tuple.Create(true, new string[] { }));
        }
Esempio n. 7
0
        public async Task <Tuple <bool, string[]> > DeleteRoleAsync(IApplicationRole role)
        {
            var result = await roleManager.DeleteAsync(role as ApplicationRole);

            return(Tuple.Create(result.Succeeded, result.Errors.Select(error => error.Description).ToArray()));
        }