在 asp.net mvc 5 中使用身份自定义用户和角色
Posted
技术标签:
【中文标题】在 asp.net mvc 5 中使用身份自定义用户和角色【英文标题】:Customizing users and roles using identity in asp.net mvc 5 【发布时间】:2017-09-14 15:48:15 【问题描述】:我有使用
进行身份自定义的示例项目Install-Package Microsoft.AspNet.Identity.Samples -pre
命令。但是,对于这个项目,我有一个通用的 ApplicationUser 类,代表我的应用程序的所有用户。如果我有不同类别的用户怎么办。例如,我可能有Teacher
和Student
实体,代表这两个实体的数据将不同。如何自定义我的应用程序以存储具有 ApplicationUser 的所有功能的实体的数据?
我认为的一种方法是从 ApplicationUser 继承这两个类,然后在 IdentityConfig.cs
中进行适当的更改并为每个类定义控制器。还有其他有效的方法吗?
如果我想使用内置的身份验证和授权功能但使用数据库优先工作流怎么办?
【问题讨论】:
【参考方案1】:首先,您想知道如何创建用户的“类型”。您这样做的方式正是您所期望的:从ApplicationUser
继承。默认情况下,这将产生一个带有额外Discriminator
列的“用户”表。此列将存储已持久化的类类型,即“教师”、“学生”或“应用程序用户”,EF 将利用此信息为每个特定记录新建正确的类。
不过,需要注意的一点是,您需要了解 UserManager
的工作原理,即它是一个泛型类 (UserManager<TUser>
)。示例中的默认AccountController
实现在控制器上定义了UserManager
属性,它是UserManager<ApplicationUser>
的一个实例。如果您将此实例与Teacher
之类的东西一起使用,它将向上转换为ApplicationUser
。特别是如果您要执行UserManager.Create(teacher)
之类的操作,它实际上 会保存ApplicationUser
,而不是(Discriminator
列的值将是“ApplicationUser”,而不是“Teacher”)。如果您需要使用派生的用户类型,则需要为此创建 UserManager<Teacher>
和 UserManager<Student>
的单独实例。
接下来,您想知道是否可以使用“数据库优先工作流程”。要回答这个问题,我们需要准确定义这意味着什么。 EF 有它所谓的“数据库优先”,它使用 EDMX 来表示您的数据库实体。这尤其与 Identity 不兼容。然而,尽管有这个名字,EF 称之为“代码优先”,它可以与现有数据库一起工作,也可以创建一个新数据库。换句话说,是的,如果您愿意,您可以使用现有数据库,但不,您不能使用 EF 意义上的“数据库优先”。有关将现有数据库与 Code First 结合使用的更多信息,请参阅我的post。
【讨论】:
我从 ApplicationUser 继承了 Student 类,并用继承自 UserManagerAuthenticationManager.SignIn(new AuthenticationProperties IsPersistent = isPersistent , await user.GenerateUserIdentityAsync(StudentManager));
IdentitySample.Models.StudentManager
转换为Microsoft.AspNet.Identity.UserManager<IdentitySample.Models.ApplicationUser>
”
您不应更改实际的 ApplicationUserManager
类。保持原样。就在您的控制器中,当您使用 Student
之类的东西时,创建一个 UserManager<Student>
的新实例。以上是关于在 asp.net mvc 5 中使用身份自定义用户和角色的主要内容,如果未能解决你的问题,请参考以下文章
使用自定义数据库而不是 ASPNETDB 的 ASP.NET MVC 身份验证?
我们可以在不使用 ASP.Net Identity 的情况下使用 MVC 5 提供的 cookie 身份验证吗?