【发布时间】:2020-09-27 12:30:13
【问题描述】:
我有一个带有基本 jwt 身份验证和基于角色授权的 web api。现在我想限制某些字段被角色 user 中的用户编辑,因为基于路由的授权是不够的。
class Account {
public int Id {get; set;}
public string Email {get; set;}
public string Password {get; set;}
public bool Enabled {get; set;} // <- this field should only be editable by an admin or manager
public int RoleId {get; set;} // <- this field should only be editable by an admin
}
当用户是角色用户时,他只能更改他的电子邮件地址和密码,但仅限于他的帐户。当他在角色管理器中时,他应该能够编辑字段电子邮件、密码和启用,但仅限于用户角色中的帐户。管理员可以编辑每个用户的每个字段。
有什么可以解决我的问题的,例如这样的:
class Account {
public int Id {get; set;}
public string Email {get; set;}
public string Password {get; set;}
[Authorize(Roles = "Admin,Manager")]
public bool Enabled {get; set;} // <- this field should only be editable by an admin or manager
[Authorize(Roles = "Admin")]
public int RoleId {get; set;} // <- this field should only be editable by an admin
}
关于我的项目的更多信息: - ASP.NET 核心 3.1 - 我使用 Entity Framework Core 和 Postgres 数据库 - 对于身份验证,我使用基本的 jwt 不记名身份验证
【问题讨论】:
-
据我所知,目前还没有内置功能可以实现这个需求,你必须在你的业务逻辑中判断当前用户,你可以跟踪哪个字段被修改,然后再决定是否按照当前用户角色继续操作。另外,我在github上创建了VOC,你可以参考这个link来检查PG是否开启了这个功能。
-
这个问题可以在 Node.js 中使用 Plumier request/response body authorization轻松解决
-
框架中没有类似的内置功能~现在~,但是,只需创建两个具有基于路由授权的端点,一个能够修改此字段,另一个没有,不`不解决你的问题?或者在一个路由上分离两个方法,然后检查用户是否是管理员,走一条路,如果不是,走这条路
-
一个好的解决方法是将您想要的“只读”值从联系人类中提取到具有私有设置器的另一个 ContactAdminClass 中,并让您的常规联系人类继承自该类。这应该可以最大限度地减少您必须做的工作量,并确保您的普通用户无法编辑 Id。您需要小心地将类正确地转换为 ContactAdmin 以便从您的管理员端进行编辑。
-
您可以像这样制作自己的属性,并在设置逻辑中使用反射。
标签: c# asp.net asp.net-core .net-core entity-framework-core