我有一个简单的沙盒项目,我正在使用它来更好地理解.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.为什么在添加角色后突然同步?
感谢任何帮助。
答案 0 :(得分:1)
由于EntityFramework Identity UserStore没有请求信息,因此在致电Roles
后,您的GetUserAsync()
收藏品不会被填充。它相当于您通过DbContext
直接访问用户数据而无需调用Include()
。
现在EF Core does not support lazy loading,因此user.Roles
导航属性不会自动填充。是的,这使得这一行为在某种程度上是不诚实的。
在您对GetRolesAsync()
和AddToRoleAsync()
的来电中,正在为您明确填充数据,因为您正在直接操作这些角色。