2017-02-17 6 views
1

У меня есть простой проект песочницы, который я использую, чтобы лучше понять, как работает 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. Почему он неожиданно синхронизируется после добавления роли?

Любая помощь приветствуется.

ответ

1

Ваша Roles коллекция не заполняется после звонка GetUserAsync(), так как EntityFramework Identity UserStore не запрашивает информацию. Он выполняет эквивалент доступа к пользовательским данным непосредственно через ваш DbContext и без каких-либо вызовов Include().

Прямо сейчас EF Core does not support lazy loading, и поэтому навигационная способность user.Roles не заполняется автоматически. И да, это делает поведение несколько неискренним в данный момент.

В ваших звонках GetRolesAsync() и AddToRoleAsync() данные явно заполняются для вас, поскольку вы непосредственно работаете с этими ролями.

+0

Спасибо за ссылку. Сначала я просто собирался сказать «зачем им помещать его в объект, если они не собираются его заполнять», но в разделе «Закладка» этой страницы говорится, что он будет наступать. – nurdyguy

+0

Хех, лучше всего, пользователь.Роли' доступны только для чтения, поэтому я даже не могу его заполнить! – nurdyguy

Смежные вопросы