Удаление пользователя из роли в ASP.NET MVC 5 - PullRequest
0 голосов
/ 19 мая 2018

В настоящее время я создаю RESTful Web API, чтобы пользователь мог быть удален из роли в приложении.

Это UsersController (API):

public class UsersController : ApiController
{
    private ApplicationDbContext _identity;
    private readonly UserManager<ApplicationUser> _userManager;

    public UsersController()
    {
        _identity = new ApplicationDbContext();
        var store = new UserStore<ApplicationUser>(_identity);
        _userManager = new UserManager<ApplicationUser>(store);
    }              

    // --- REMOVE USER FROM ROLE HERE ---
    [HttpDelete]
    [Route("api/users/{userId}/roles/{roleName}")]
    public async void RemoveFromRole(string userId, string roleName)
    {
        var userInDb = _identity.Users.SingleOrDefault(u => u.Id == userId);

        if (userInDb == null)
            throw new HttpResponseException(HttpStatusCode.NotFound);

        var roleInDb = _identity.Roles.SingleOrDefault(r => r.Name == roleName);

        if (roleInDb == null)
            throw new HttpResponseException(HttpStatusCode.NotFound);

        await _userManager.RemoveFromRoleAsync(userInDb.Id, roleInDb.Id);
    }

Я вызываю метод RemoveFromRole, используя этот AJAX-запрос в представлении:

$("#roles").on("click", ".js-delete", function() {
    var button = $(this);
    bootbox.confirm("Are you sure you want to remove the user from this role?",
        function(result) {
            if (result) {
                $.ajax({
                    url: "/api/users/" +
                        button.attr("data-user-id") +
                        "/roles/" +
                        button.attr("data-role-name"),
                    method: "DELETE",
                    success: function() {
                        location.reload();
                        toastr.success("Role removed");
                    },
                    error: function() {
                        toastr.error("Unable to remove user from role");
                    }
                });
            }
        });
});

Однако при выполнении этого RemoveFromRoleAsync не удается (result.Succeeded = false), и поэтому пользовательне удален из роли.

Я новичок в использовании ASP Identity и, возможно, неправильно использую UserManager / UserStore.

1 Ответ

0 голосов
/ 19 мая 2018

В диспетчере пользователей есть метод Task<IList<string>> GetRolesAsync(TKey userId), который

Возвращает роли для пользователя

Используйте его для получения назначенных ролей пользователя.Убедитесь, что роль, которую нужно удалить, существует для этого пользователя, а затем удалите ее с помощью диспетчера пользователей.

[HttpDelete]
[Route("api/users/{userId}/roles/{roleName}")]
public async Task<IHttpActionResult> RemoveFromRole(string userId, string roleName) {
    var userInDb = _identity.Users.FirstOrDefault(user => user.Id == userId);
    if (userInDb == null)
        return NotFound();

    //get user's assigned roles
    IList<string> userRoles = await _userManager.GetRolesAsync(userId);

    //check for role to be removed
    var roleToRemove = userRoles.FirstOrDefault(role => role.Equals(roleName, StringComparison.InvariantCultureIgnoreCase));
    if (roleToRemove == null)
        return NotFound();

    var result = await _userManager.RemoveFromRoleAsync(userId, roleToRemove);
    if(result.Succeeded)
        return Ok();

    return BadRequest();
}

Обратите внимание, что действие было также изменено с учетом рекомендованного синтаксиса из документации

...