.net - 根据用户请求访问的组织(按请求)修改 .NET Core 角色
问题描述
我有一个用例,其中 .NET Core API 的用户可以属于多个“组织”,并且在这些组织中具有不同的角色。
例如,如果他们代表 OrganizationId = 1 发布到位置/创建端点,他们应该具有管理员权限。但是,如果他们尝试代表 OrganizationId = 2 访问该端点,他们应该只有基本用户权限。用户无需注销并再次登录即可执行这些操作。
我想编写一些中间件来进行数据库调用并检索他们尝试修改的组织中用户的角色,然后在控制器上使用 .NET Core 角色语法来限制该级别的访问。
我还没有找到这样一个例子,即在请求管道到达控制器操作之前,中间件在每个请求上修改用户角色。有没有人有类似的身份验证方案的经验?
解决方案
您是否考虑过在数据库中保留一个权限模型来映射每个组织的给定用户角色,而不是修改用户在中间件中的角色?然后,您可以根据请求的域和用户在该域中的权限级别允许/拒绝中间件中的请求。
例如,John Smith 属于 ID 为 1 和 2 的两个组织。用户权限模型可能如下所示:
UserPermissionLevel
------------------------------------------------
| Uid | Name | OrganizationId | RoleId |
|----------------------------------------------|
| 1 | John Smith | 1 | 1 |
| 1 | John Smith | 2 | 2 |
| 2 | Jane Doe | 2 | 1 |
------------------------------------------------
你会有一个单独的表,其中包含角色权限,如下所示:
Role
-------------------------------------
| RoleId | Name | CanGet | CanPost |
|-----------------------------------|
| 1 | Admin | True | True |
| 2 | Basic | True | False |
-------------------------------------
使用此模型,您可以在中间件中查询这些表以确定适当的访问级别。
public class OrgAuthorizationMiddleware
{
...
public async Task Invoke(HttpContext context, MyDbContext databaseContext)
{
// Check that the user has the requested role and the
// appropriate permission for the request as needed.
// Add additional request type logic to check user's
// specific permissions from UserPermissionLevel.
if databaseContext.Role.Any(x => x.RoleId, RoleId)
{
await _next.Invoke(context);
}
else
{
context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
}
}
}
推荐阅读
- javascript - 谷歌翻译中缺少文字
- php - Drupal 7:如何在主题文件中获取模块配置设置?
- jquery - 导入错误:您的 SQL 语法有错误;
- c - PMAP 的使用 / 动态加载库 (C/Linux)
- google-cloud-build - gcs-fetcher 无法正确解压缩我的 App Engine 源代码。缺少文件
- google-app-engine - GAE Go 运行时 1.11 需要比运行时 1.9 更多的实例。这么常见吗?
- database - 为什么有些键值数据存储拒绝表/桶的概念?
- javascript - 有没有办法防止排他的水平/垂直平移/滚动,即栏杆?
- c# - “System.Web.UI.Page”不包含“DataItem”的定义
- flutter - 如何在颤动中更改文本字段的晦涩字符?