首页 > 解决方案 > 根据用户请求访问的组织(按请求)修改 .NET Core 角色

问题描述

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

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

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

我还没有找到这样一个例子,即在请求管道到达控制器操作之前,中间件在每个请求上修改用户角色。有没有人有类似的身份验证方案的经验?

标签: .netauthenticationasp.net-coreasp.net-core-webapiasp.net-roles

解决方案


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

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

推荐阅读