使用asp.net mvc 5中的标识自定义用户和角色

时间:2017-04-18 17:13:37

标签: asp.net-mvc-5 asp.net-identity-2

我有使用

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

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

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

1 个答案:

答案 0 :(得分:0)

首先,您想知道如何创建"类型"用户你这样做的方式正是你的预期:从ApplicationUser继承。默认情况下,这将导致单个"用户"包含其他Discriminator列的表格。此列将存储已保留的类类型,即"教师","学生"或" ApplicationUser"和EF将利用此信息来新建每个特定记录的正确等级。

有一点需要注意的是,您需要了解UserManager的工作原理,即它是一个通用类(UserManager<TUser>)。您从示例中获得的默认AccountController实现在控制器上定义了UserManager属性,该属性是UserManager<ApplicationUser>的实例。如果您将此实例用于Teacher之类的内容,则会将其更新为ApplicationUser。特别是如果您要执行UserManager.Create(teacher)之类的操作,则实际保存ApplicationUser,而Discriminator列的值将为&UserManager<Teacher> #34; ApplicationUser&#34;,而不是&#34;教师&#34;)。如果您需要使用派生的用户类型,则需要为此目的创建UserManager<Student>Observable.empty()的单独实例。

接下来,您想知道是否可以使用&#34;数据库第一个工作流程&#34;。要回答这个问题,我们需要准确定义这意味着什么。 EF拥有所谓的“数据库优先”和#34;它使用EDMX来表示您的数据库实体。这尤其与身份不兼容。然而,尽管有这个名字,EF所谓的“Code First&#34;”可以与现有数据库一起使用,也可以创建一个新数据库。换句话说,是的,如果您愿意,可以使用现有的数据库,但不能在EF意义上使用&#34;数据库优先&#34;。有关使用Code First的现有数据库的详细信息,请参阅我的post