Проблема Обновление роли пользователя в ядре asp. net. - PullRequest
1 голос
/ 27 марта 2020

При регистрации все пользователи добавляются в общую роль. Как администратор может обновить или изменить роль пользователя, чтобы дать ему больше привилегий.

Обновление роли - это проблема в настоящее время. Есть то, что я уже сделал. Модель EditRole

    public class EditRole
    {
        public EditRole()
        {
            Users = new List<string>();
        }
        public string Id { get; set; }
        [Required(ErrorMessage = "Role Name is Required")]
        public string RoleName { get; set; }
        public List<string>Users { get; set; }
    }

В представлении я Я уже передал идентификатор роли в URL, я также могу получить список пользователей, а затем выбрать пользователя, которого я хочу обновить, из выпадающего списка. Я думал, так как у меня есть идентификатор роли, я могу запросить с помощью UserManager и назначить выбранного пользователя для роли.

@model LoanWarehouse.Repo.Models.EditRole

<div class="container" style="margin-top: 100px">
    <div class="row">
        <div class="col-md-6">
            <h2>Please select user and the role you want to assign</h2>
            <form asp-action="Assign" >
                <div class="dropdown">
                    <select asp-for="Users" id="roles" class="form-control">
                        <option>Select User</option>
                        @foreach (var user in Model.Users)
                        {
                            <option asp-for="Users">@user</option>
                        }
                    </select>
                </div>
                <div class="form-group has-feedback">
                    <input type="hidden" asp-for="@Model.Id" class="form-control" placeholder="Role">
                    <span asp-validation-for="Id" class="help-block"></span>
                </div>
                @*<td><a class="btn btn-warning btn-sm" asp-controller="Admin" asp-action="EditRole" asp-route-id="@role.Id">Edit</a></td>*@

                <button type="submit"  class="btn btn-success" >Assign User to role</button>
            </form>

        </div>
    </div>
</div>

Этот контроллер

  [HttpPost]
        public async Task<IActionResult> Assign(string id, EditRole model)
        {
            try
            {
              var role = roleManager.FindByIdAsync(model.Id);//find passed in role id
           var currentRole = roleManager.FindByNameAsync(model.Users[0]);//find the role of current user
            var user = await userManager.FindByNameAsync(model.Users[0]);

                if (role == null)
                {
                    ViewBag.ErrorMessage = $"Role with Id = {id} cannot be found";
                    return RedirectToAction("ListRoles", "Admin");
                }
                else
                {
                   await userManager.RemoveFromRoleAsync(user, currentRole.Result.Name);
                   await userManager.AddToRoleAsync(user, role.Result.Name);
                   return RedirectToAction("ListRoles", "Admin");
                }
            }
            catch (Exception ex)
            {

                throw ex;
            }

        }

Я не могу получить это на работу Может кто-нибудь помочь

1 Ответ

0 голосов
/ 30 марта 2020

В вашем коде вы используете RoleManager.FindByNameAsyn c (String) метод , чтобы найти роль текущего пользователя, и вы предоставляете имя пользователя (не имя роли), которое вызывает вопрос.

var currentRole = roleManager.FindByNameAsyn c (model.Users [0]);

Чтобы исправить это, вы можете использовать UserManager.GetRolesAsyn c (TUser) Метод для получения имен ролей, к которым принадлежит указанный пользователь, как показано ниже.

var role = await roleManager.FindByIdAsync(model.Id);
var user = await userManager.FindByNameAsync(model.Users[0]);

//find the role(s) of current user
var currentRoles = await userManager.GetRolesAsync(user);

// ...
//your code logic here

await userManager.RemoveFromRolesAsync(user, currentRoles);

//...
...