Как добавить простые пользовательские роли - Asp.net MVC С#

Я новичок в asp.net mvc, и я рассматривал множество разных способов добавления ролей пользователя для моего сайта asp mvc. Я хочу использовать базу данных пользователей, которые автоматически созданный для вас, когда вы создаете новый проект mvc. Они содержат таблицы:

  • AspNetRoles
  • AspNetUserClaims
  • AspNetUserLogins
  • AspNetUserRoles
  • AspNetUsers

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

Все, что я хочу сделать, это что-то вроде этого

[Authorize(Roles = "admin")]
public ActionResult Index()
{
    Return View();
}

Таким образом, пользователи с администратором роли могут получить доступ к странице индекса. Вся помощь оценивается.

Ответы

Ответ 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
    }));