У меня есть простой проект песочницы, который я использую, чтобы лучше понять, как работает Core Identity, и я столкнулся с некоторой несогласованностью, которую, я надеюсь, кто-то может объяснить. В этом проекте используется Entity Framework.Роли идентичности не заполнены
Я использовал эту статью awesome, чтобы помочь мне создать проект, https://medium.com/@goodealsnow/asp-net-core-identity-3-0-6018fc151b4#.2env44446 и мой пользовательский класс выглядит следующим образом.
public class User : IdentityUser<int>
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string TempPassword { get; set; }
}
Я населили дб с тремя пользователями и три роли, одного пользователя для каждой роли, «Владелец», «Администратор» и «Пользователь». Я добавил некоторые политики за свои действия,
auth.AddPolicy("Owner", policy =>
{
policy.RequireAuthenticatedUser();
policy.RequireRole("Owner");
});
auth.AddPolicy("Admin", policy =>
{
policy.RequireAuthenticatedUser();
policy.RequireRole("Admin", "Owner");
});
auth.AddPolicy("User", policy =>
{
policy.RequireAuthenticatedUser();
});
поэтому мои атрибуты, такие как [Authorize("Admin")]
работы большой. Я даже добавил некоторые главные расширения, как так
public static class PrincipalExtensions
{
public static bool IsOwner(this ClaimsPrincipal principal)
{
return principal.IsInRole("Owner");
}
public static bool IsAdmin(this ClaimsPrincipal principal)
{
return principal.IsInRole("Admin") || principal.IsInRole("Owner");
}
public static bool IsUser(this ClaimsPrincipal principal)
{
return principal.Identity.IsAuthenticated;
}
}
, так что я могу сделать if(User.IsAdmin())
и это прекрасно работает, как хорошо.
Вот где он получает странно ...
Если я пошагово следующий код я получаю запутанные результаты.
var user = await _userManager.GetUserAsync(User);
var userRoles = await _userManager.GetRolesAsync(user);
await _userManager.AddToRoleAsync(user, "Owner");
Первая строка получает мне User
объект для принципала. На этом объекте есть коллекция его Ролей, user.Roles
, но он будет показывать пустое (Count = 0), хотя у пользователя есть есть роли.
Вторая строка получает пользователя Roles
, и он заполняется правильно.
В третьей строке добавлена роль «Владелец» для пользователя, и она работает правильно (обновляется db), а также локальная переменная user
теперь имеет эту роль в user.Roles
! Обратите внимание: ни одна из других ролей пользователя не появится, только одна.
Итак, у меня есть в основном два вопроса: 1. Почему у объекта user
есть user.Roles
, населенный для начала? 2. Почему он неожиданно синхронизируется после добавления роли?
Любая помощь приветствуется.
Спасибо за ссылку. Сначала я просто собирался сказать «зачем им помещать его в объект, если они не собираются его заполнять», но в разделе «Закладка» этой страницы говорится, что он будет наступать. – nurdyguy
Хех, лучше всего, пользователь.Роли' доступны только для чтения, поэтому я даже не могу его заполнить! – nurdyguy