gpt4 book ai didi

.net - 根据用户请求访问的组织(每个请求)修改 .NET Core 角色

转载 作者:行者123 更新时间:2023-12-02 06:11:24 25 4
gpt4 key购买 nike

我有一个用例,其中 .NET Core API 的用户可以属于多个“组织”,并在这些组织中具有不同的角色。

例如,如果他们代表 OrganizationId = 1 发布到位置/创建端点,则他们应该具有管理员权限。但是,如果他们尝试代表 OrganizationId = 2 访问该端点,则他们应该仅具有基本用户权限。用户无需注销并再次登录即可执行这些操作。

我想编写一些中间件来进行数据库调用并检索用户在尝试修改的组织中的角色,然后在 Controller 上使用 .NET Core 角色语法来限制该级别的访问。

我无法找到中间件在请求管道到达 Controller 操作之前针对每个请求修改用户角色的示例。有人有类似的身份验证方案的经验吗?

最佳答案

您是否考虑过在数据库中保留一个权限模型来映射每个组织的给定用户角色,而不是修改中间件中的用户角色?然后,您可以根据请求的域和用户在该域中的权限级别来允许/拒绝中间件中的请求。

例如,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;
}
}
}

关于.net - 根据用户请求访问的组织(每个请求)修改 .NET Core 角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59970220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com