如何在ASP.NET Identity中定义不同的用户类型?

How to define different user types in ASP.NET Identity?

在我的应用程序中,我使用 ASP.NET 身份,我有不同类型的用户(教师、学生等),它们有自己的属性,对于教师,我有 Experience, Languages Spoken, Certifications, Awards, Affiliations, ... 和对于 Student 我有不同的属性。所以这样我就不能使用角色,因为每个用户的信息不同。所以他们实际上都是用户 我的意思是他们可以登录我的网站。他们还有用于注册的通用信息:First Name, Last Name, Email, Password 现在您有什么看法,这样做的最佳选择是什么?我应该为每个继承自 IdentityUser<int, CustomUserLogin, CustomUserRole, CustomUserClaim> 的用户创建 class 吗? 有什么想法吗?

PS:我找到了一些解决方案,例如 here 建议使用 Claims 但对我来说还不够清楚,实际上声明是难题的难点,我不明白它们是什么? :),最好有例子。谢谢

由于所有用户都将拥有一些相同的属性,因此创建一个 "User" class 来保存教师、学生等的所有相同属性是有意义的。

然后我会为每个用户类型创建一个 class,其中只包含特定于该类型用户的属性。在此 class 中,我会将 UserId 作为属性之一包含在内,这样您就可以从主要组到他们的个人类型之间建立关系。见下文:

用户Class: UserId(主键), 名, 姓, 登录, 密码, 等等

老师Class: UserId(外键), 授课年级, 经验, 奖项, 等等

学生Class: UserId(外键), 年级, 荣誉, 等等

有很多方法可以完成您想要的,所以这只是一个建议。祝你好运!

方法#1:

Claims 方法可能是可行的方法。因此,您以正常方式从 IdentityUser 派生,并将公共属性添加到派生的 class。然后,对于每种类型的用户,您将使用 UserManager.AddClaimAsync.

添加额外的声明

因此,例如,假设您创建了一个名为 AppUser 的新 class 用户 class。然后你可以这样做:

AppUser teacher = new AppUser { /* fill properties here */ };
/* Save User */
await userManager.AddClaimAsync(teacher.Id, new Claim("app_usertype", "teacher"));
await userManager.AddClaimAsync(teacher.Id, new Claim("app_grade", 4));
await userManager.AddClaimAsync(teacher.Id, new Claim("app_exp", 10));
await userManager.AddClaimAsync(teacher.Id, new Claim("app_awards", "Award1,Award2"));
await userManager.AddClaimAsync(teacher.Id, new Claim("app_langspoken", "English,French,German"));

AppUser student = new AppUser { /* fill properties here */ };
/* Save User */
await userManager.AddClaimAsync(student.Id, new Claim("app_usertype", "student"));
await userManager.AddClaimAsync(student.Id, new Claim("app_grade", 2));

这些将为不同类型的用户添加不同的声明。所以 teacher 声称有 "app_experience" 的“10”,"app_awards" 的 "Award1" 和 "Award2",等等。另一方面,student声称只有 "app_grade" 个“2”。

基本上,第一个参数标识声明的类型,第二个参数是支持该声明的数据。类型可以是任何类型,因此请选择对您的应用程序有意义的类型,并可能在每个名称前加上前缀以区别于其他名称。在我刚刚添加前缀 "app".

的情况下

然后您可以使用 UserManager.GetClaimsAsync 获取用户的所有声明并在 returned 列表中搜索您感兴趣的声明。

方法 #2

另一种方法是创建一个 AppUser class 然后 TeacherStudent class 从 AppUser 派生.在这些 classes 中,您将添加本应作为上述示例中的声明添加的属性。

这样做的一个小缺点是,您必须为这些不同的用户中的每一个创建单独的 table,这些用户与 ASP.NET 身份用户 table 的关系。

此外,使用 FindByUserNameAsyncFindByEmailAsync 等,只会 return 一种类型的 TUser,在本例中为 AppUser。此外,这些方法只会查询一个 table、AspNetUsers,因此您需要从相关的 TeacherStudent table 中获取额外信息].