1

Microsoft Identity 引入了UserManager<T>与和其他数据库表RoleManager<T>交互的类AspNetUsersAspNetRoles但是我们为什么要使用它们呢?也许它是一个更好的解决方案来搭建数据库并直接使用实体框架处理它的表而忘记类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,输入IdentityRoleRoleDto
如您所见,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.

问题

搭建数据库而不使用UserManagerRoleManager类是一个好主意吗?也许你可以介绍一个更好的解决方案?

4

1 回答 1

2

为什么你认为这是个好主意?通过重写诸如身份之类的东西,你会得到什么?

ASP.NET Core 上的 Identity 简介

ASP.NET 核心标识:

  • 是一种支持用户界面 (UI) 登录功能的 API。

  • 管理用户、密码、配置文件数据、角色、声明、令牌、电子邮件确认等。

这不仅仅是数据库访问。它也是管理登录功能、安全令牌创建、安全密码管理等的代码。

如果您创建自定义系统,请外部审计员对您的解决方案进行渗透测试(尽管无论您做出何种选择,这都是一个好主意),单元测试,性能测试等,您都需要考虑上述所有因素。

以上所有已经完成。您也可以使用各种挂钩点轻松自定义身份。

顺便说一句,默认情况下,identity 已经使用 ef 来访问数据存储。

一定要构建你的多层应用程序,但不要忘记它的身份。这是一个横向关注点,它的存在是为了简化您的开发并让您只担心您的业务需求。

于 2021-03-16T16:25:42.323 回答