身份角色未填充

时间:2017-02-17 16:33:20

标签: entity-framework asp.net-core identity

我有一个简单的沙盒项目,我正在使用它来更好地理解.net核心身份如何工作,我遇到了一些不一致的问题,我希望有人可以解释。该项目正在使用实体框架。

我使用这篇 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并正确填充。

第三行将“Owner”角色添加到用户并且它正常工作(db已更新)但是,局部变量user突然现在在user.Roles中具有该角色!请注意,用户的其他角色都不会显示,只有那个。

所以我基本上有两个问题:1。为什么user对象没有填充user.Roles? 2.为什么在添加角色后突然同步?

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

由于EntityFramework Identity UserStore没有请求信息,因此在致电Roles后,您的GetUserAsync()收藏品不会被填充。它相当于您通过DbContext直接访问用户数据而无需调用Include()

现在EF Core does not support lazy loading,因此user.Roles导航属性不会自动填充。是的,这使得这一行为在某种程度上是不诚实的。

在您对GetRolesAsync()AddToRoleAsync()的来电中,正在为您明确填充数据,因为您正在直接操作这些角色。