Microsoft Identity 引入了UserManager<T>
与和其他数据库表RoleManager<T>
交互的类AspNetUsers
。AspNetRoles
但是我们为什么要使用它们呢?也许它是一个更好的解决方案来搭建数据库并直接使用实体框架处理它的表而忘记类UserManager<T>
和RoleManager<T>
?
我为什么要问?
我的应用程序要遵循多层架构。我开始为用户创建 DTO 类:
public class UserDto
{
public string Id { get; set; }
public string UserName { get; set; }
...
public List<RoleDto> Roles { get; set; }
}
public class RoleDto
{
public string Id { get; set; }
public string Name { get; set; }
...
}
输入IdentityUser
我想映射到UserDto
,输入IdentityRole
到RoleDto
。
如您所见,UserDto
我想存储用户的角色。
现在让我们看一下IdentityUser
类型:链接。它包含很多属性,但它没有用户的角色。
因此,当映射IdentityUser
到时UserDto
,我需要使用RoleManager<T>
来获取用户的角色。我认为,这是一个肮脏的解决方案。
我的想法
我们可以忘记UserManager<T>
和RoleManager<T>
类型。我们可以简单地搭建数据库并使用实体框架来处理它。
在建立数据库脚手架后,我有以下内容:
public partial class AspNetUser
{
public string Id { get; set; }
public string UserName { get; set; }
public string NormalizedUserName { get; set; }
public string Email { get; set; }
public string NormalizedEmail { get; set; }
public bool EmailConfirmed { get; set; }
public string PasswordHash { get; set; }
public string SecurityStamp { get; set; }
public string ConcurrencyStamp { get; set; }
public string PhoneNumber { get; set; }
public bool PhoneNumberConfirmed { get; set; }
public bool TwoFactorEnabled { get; set; }
public DateTimeOffset? LockoutEnd { get; set; }
public bool LockoutEnabled { get; set; }
public int AccessFailedCount { get; set; }
public virtual ICollection<AspNetUserClaim> AspNetUserClaims { get; set; }
public virtual ICollection<AspNetUserLogin> AspNetUserLogins { get; set; }
public virtual ICollection<AspNetUserRole> AspNetUserRoles { get; set; }
public virtual ICollection<AspNetUserToken> AspNetUserTokens { get; set; }
}
// AspNetUserClaim, AspNetUserLogin, AspNetUserRole and AspNetUserToken
我只介绍了简短的 AspNetUser 类。如您所见,它有一个属性 AspNetUserRoles - 用户的角色。太好了,因为现在将这个类映射到UserDto
.
问题
搭建数据库而不使用UserManager
和RoleManager
类是一个好主意吗?也许你可以介绍一个更好的解决方案?