【问题标题】:Multiple User types and Identity多种用户类型和身份
【发布时间】:2023-01-27 09:03:46
【问题描述】:

在我的项目中,我目前正在处理用户角色(声明)和注册。

我正在为我应该使用哪种方法或者是否有任何我可以基于的来源而苦苦挣扎。 我有两种类型的应用程序用户(与应用程序的域相关),假设他们是讲师和学生,这些实体在几个领域有所不同,所以我想将它们分开。

我现在应该如何设计实体?

有一些案例,但我不确定如何涵盖它们。

用户可以是讲师

用户可以是学生

用户可以同时是讲师和学生(同时)

我该如何管理?

我正在考虑为每个实体(Lecturer/Student/AnyOtherType)添加一个外键以引用 IdentityUser 并在注册期间通过声明定义用户类型

userIdentity.AddClaim(new Claim(ClaimTypes.Role, "Lecturer"))
userIdentity.AddClaim(new Claim(ClaimTypes.Role, "Student"));

你认为这是个好主意吗? 如何根据用户角色处理传入请求?我知道我可以在某些服务中使用类似于以下示例的内容,但理想情况下,我想避免对数据库进行不必要的调用,只是为了过滤掉服务中所需的数据

user.IsInRole("lecturer")

我专注于 DDD rn。

【问题讨论】:

  • 我认为你应该有一个用户表来存储所有共享信息,并将角色和用户 ID 等放入一个单独的表中。

标签: c# .net asp.net-core .net-core asp.net-web-api


【解决方案1】:

您可以创建另一个角色讲师-学生角色并将用户添加到三个角色:学生角色,讲师角色讲师-学生角色.

如果您的系统中有只有具有 Lecturer-Student-Role 角色的用户才能执行的操作,您可以使用以下代码进行检查:

bool isLecturerStudentRole = await userManager.IsInRoleAsync(user, "Lecturer-Student-Role");

此外,为了解决基于用户角色处理传入请求的问题,如果您有控制器或 API 操作并且您想要检查特定端点的授权,您也可以将属性 Authorize 与特定角色一起使用。检查下面的例子:

[Authorize(Roles = "Lecturer-Student-Role")]
public class MyController : BaseController
{

}

您可以使用引用 User.Id 表的外键分隔表。因此,通过这种方式,您可以为系统中的特定用户管理不同的列。

PS:在创建 Role 时使用前缀/后缀是一个很好的做法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 2019-03-30
    • 1970-01-01
    • 2020-11-16
    • 2017-12-16
    相关资源
    最近更新 更多