Pierwszym krokiem jest utworzenie roli admin
. Jest to dość łatwe:
context.Roles.Add(new IdentityRole { Name = "admin" });
context.SaveChanges();
Aby dodać rolę do istniejącego użytkownika:
var role = context.Roles.SingleOrDefault(m => m.Name == "admin");
user.Roles.Add(new IdentityUserRole { RoleId = role.Id });
Oba te kroki mogą i powinny być traktowane w swojej metodzie Migrations\Configuration.cs
Seed
, wraz z utworzeniem jakichkolwiek początkowych użytkowników to powinno być administratorami.
Aby administratorzy mogli dodawać role innym użytkownikom, pierwszy krok jest już objęty: ochrona akcji za pomocą [Authorize(Roles = "admin")]
.
Następnie potrzebny będzie model widoku do pracy z użytkownikiem. Coś jak następuje:
public class UserViewModel
{
// user properties you'd like to edit here
public List<int> SelectedRoleIds { get; set; }
public IEnumerable<SelectListItem> RoleChoices { get; set; }
}
Musisz mapować ApplicationUser
do/z tego widoku modelu.Następnie trzeba ręcznie wypełnić dwie właściwości rolę w UserViewModel
:
RoleChoices
powinien być przeliczalny wszystkich dostępnych ról:
model.RoleChoices = context.Roles.Select(m => new SelectListItem
{
Value = m.Id,
Text = m.Name
});
SelectedRoleIds
powinna być lista identyfikatorów ID wszystkich ról przypisanych aktualnie dla użytkownika:
model.SelectedRoleIds = user.Roles.Select(m => m.RoleId);
w widoku, a następnie będziesz budować swoją wielokrotny:
@Html.ListBoxFor(m => m.SelectedRoleIds, Model.RoleChoices)
Podczas tworzenia nowego użytkownika, można po prostu ustawić role przez użytkownika bezpośrednio na stanowisko:
user.Roles = model.SelectedRoleIds.Select(m => new IdentityUserRole { RoleId = m });
Podczas edycji istniejącego użytkownika, większa troska musi być podjęta, ponieważ dostaniesz błędów integralności jeśli zapisz ten sam identyfikator roli dwa razy dla tego samego użytkownika. Po pierwsze, trzeba usunąć wszystkie role, które zostały niezaznaczone:
user.Roles.Where(m => !model.SelectedRoleIds.Contains(m.RoleId))
.ToList().ForEach(role => user.Roles.Remove(role));
Następnie trzeba dodać jakieś nowo wybrane role:
var existingUserRoles = user.Roles.Select(m => m.RoleId);
model.SelectedRoleIds.Except(existingUserRoles)
.ToList().ForEach(roleId => user.Roles.Add(new IdentityUserRole
{
RoleId = roleId
}));
chcesz dodać role za pomocą interfejsu? A może chciałbyś użyć prostego skryptu SQL, aby to zrobić i przypisać te role podczas rejestrowania użytkowników? – DSR
Mnóstwo dokumentacji na temat ról dostępnych w google. Jest w tym trochę więcej, niż uwzględniłeś. Czemu nie spróbować jednego z tych przewodników i daj nam znać, jeśli utkniesz, zamiast prosić nas o zrobienie tego za Ciebie. Głównym celem mojego wpisu jest jednak wprowadzenie alternatywy: http://visualstudiomagazine.com/articles/2013/08/01/leveraging-claims-based-security-in-aspnet-45.aspx – RandomUs1r
@DSR Id użytkownicy z rolą administratora w celu dodania ról do innych użytkowników przy użyciu ui – Rob