在 asp.net mvc 5 中使用身份自定义用户和角色

Customizing users and roles using identity in asp.net mvc 5

我有使用

进行身份定制的示例项目
Install-Package Microsoft.AspNet.Identity.Samples -pre

命令。但是,对于这个项目,我有一个通用的 ApplicationUser class 代表我的应用程序的所有用户。如果我有不同类别的用户怎么办?例如,我可能有 TeacherStudent 实体,代表这两个实体的数据将不同。如何自定义我的应用程序来为具有 ApplicationUser 的所有功能的两个实体存储数据? 我认为的一种方法是从 ApplicationUser 继承 classes,然后在 IdentityConfig.cs 中进行适当的更改并为它们中的每一个定义控制器。还有其他有效的方法吗?

如果我想使用内置的身份验证和授权功能但使用数据库优先工作流怎么办?

首先,您想知道如何创建 "types" 用户。您这样做的方式正是您所期望的:继承自 ApplicationUser。默认情况下,这将导致单个 "users" table 和一个额外的 Discriminator 列。此列将存储持久化的 class 类型,即 "Teacher"、"Student" 或 "ApplicationUser",EF 将利用此信息更新正确的 class 对于每个特定记录。

尽管如此,需要注意的一件事是您需要了解 UserManager 的工作原理,即它是一个通用的 class (UserManager<TUser>)。示例中的默认 AccountController 实现在控制器上定义了一个 UserManager 属性,它是 UserManager<ApplicationUser> 的一个实例。如果您将此实例与 Teacher 之类的东西一起使用,它将被向上转换为 ApplicationUser。特别是如果您要执行 UserManager.Create(teacher) 之类的操作,它会 实际上 保存一个 ApplicationUser,而不是(Discriminator 列的值将是 "ApplicationUser",而不是 "Teacher")。如果您需要使用派生的用户类型,则需要为此目的创建单独的 UserManager<Teacher>UserManager<Student> 实例。

接下来,您想知道是否可以使用"database first workflow"。要回答这个问题,我们需要准确定义这意味着什么。 EF 有它所谓的 "Database First",它使用 EDMX 来表示您的数据库实体。这尤其与身份不兼容。然而,尽管名称如此,但 EF 所称的 "Code First" 可以与现有数据库一起使用,也可以创建一个新数据库。换句话说,是的,如果您愿意,您可以使用现有数据库,但不可以,在 EF 意义上,您不能使用 "Database First"。有关通过 Code First 使用现有数据库的更多信息,请参阅我的 post.