Ответ 1
Первым шагом является создание роли admin
. Это достаточно просто:
context.Roles.Add(new IdentityRole { Name = "admin" });
context.SaveChanges();
Чтобы добавить роль существующего пользователя:
var role = context.Roles.SingleOrDefault(m => m.Name == "admin");
user.Roles.Add(new IdentityUserRole { RoleId = role.Id });
Оба эти действия можно и нужно обрабатывать в Seed
методе Migrations\Configuration.cs
, а также создавать любые начальные пользователи, которые должны быть администраторами.
Для того, чтобы админы могли добавлять роли другим пользователям, у вас уже есть первый шаг: защитите действие с помощью [Authorize(Roles = "admin")]
.
Далее вам понадобится модель представления для работы с вашим пользователем. Что-то вроде следующего:
public class UserViewModel
{
// user properties you'd like to edit here
public List<int> SelectedRoleIds { get; set; }
public IEnumerable<SelectListItem> RoleChoices { get; set; }
}
Вам нужно будет сопоставить вашу модель ApplicationUser
с этой моделью. Затем вам нужно вручную заполнить два свойства роли в UserViewModel
:
RoleChoices
должен быть перечислимым из всех доступных ролей:
model.RoleChoices = context.Roles.Select(m => new SelectListItem
{
Value = m.Id,
Text = m.Name
});
SelectedRoleIds
должен быть список идентификаторов всех ролей, назначенных пользователю:
model.SelectedRoleIds = user.Roles.Select(m => m.RoleId);
По вашему мнению, вы создадите свой мультиселектив:
@Html.ListBoxFor(m => m.SelectedRoleIds, Model.RoleChoices)
При создании нового пользователя вы можете просто установить роли пользователя непосредственно в сообщении:
user.Roles = model.SelectedRoleIds.Select(m => new IdentityUserRole { RoleId = m });
При редактировании существующего пользователя необходимо проявлять большую осторожность, так как вы получите ошибки целостности, если дважды сохранить один и тот же идентификатор роли для одного и того же пользователя. Во-первых, вам нужно удалить любые роли, которые были отменены:
user.Roles.Where(m => !model.SelectedRoleIds.Contains(m.RoleId))
.ToList().ForEach(role => user.Roles.Remove(role));
Затем вам нужно будет добавить все новые роли:
var existingUserRoles = user.Roles.Select(m => m.RoleId);
model.SelectedRoleIds.Except(existingUserRoles)
.ToList().ForEach(roleId => user.Roles.Add(new IdentityUserRole
{
RoleId = roleId
}));