asp.net-core-2.0 - 如何扩展 ASP.NET Core 2.0 的角色以处理不同位置的不同权限?

标签 asp.net-core-2.0 asp.net-core-webapi user-permissions user-profile

我们正在 Asp.net core 2.0 中实现一个新的 Web 应用程序,我希望能够基于多种事物的组合来限制操作,而不是基于一个特定的用户角色(如管理员、高级用户等) )。问题空间如下所示:

  • 每个用户都可以拥有一个特定的“家庭”设施,根据其工作职能,他们对该设施拥有默认权限。
  • 每个 CRUD 操作都有与其关联的特定权限。
  • 每项权限都可以在任意数量的设施中授予,可以仅授予一个,也可以根本不授予(或多种情况的组合)。
  • 特定用户可以在不同的设施拥有不同的权限。例如,区域经理可以对其合作的所有设施拥有“查看”和“订购”权限,但仅对邻近区域的设施拥有“查看”权限。

目前,我们使用自行开发的解决方案来限制权限,但它仅适用于用户的“家庭”设施。例如,我们无法授权从其他机构订购库存的人员查看其他机构的库存。

我们尝试只为每个设施中动态生成的每个操作应用角色(哎呀!),但这会导致某些用户获得他们不应该拥有的权限。更不用说,维护它是一场噩梦。

如何扩展 ASP.NET Core 2.0 中的角色功能,以允许我的用户在不同的设施中拥有不同的权限,而无需为每个设施的每个操作创建角色?

最佳答案

我建议使用策略。它们为您提供更细粒度的控制。基本上,您从一个或多个“要求”开始。例如,您可以从以下内容开始:

public class ViewFacilitiesRequirement : IAuthorizationRequirement
{
}

public class OrderFacilitiesRequirement : IAuthorizationRequirement
{
}

这些主要用作授权处理程序的附件,因此它们非常基本。关键在于这些授权处理程序,您可以在其中定义满足要求的实际含义。

public class ViewFacilitiesHandler : AuthorizationHandler<ViewFacilitiesRequirement>
{
    protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, ViewFacilitiesRequirement requirement)
    {
        // logic here, if user is authorized:
        context.Succeed(requirement);
    }
}

授权处理程序是依赖注入(inject)的,因此您可以注入(inject)像 DbContext 这样的东西, UserManager<TUser>等以正常方式进入它们,然后查询这些来源以确定用户是否被授权。

一旦您有了一些要求和处理程序,您就需要注册它们:

services.AddAuthorization(o =>
{
    o.AddPolicy("ViewFacilities", p =>
        p.Requirements.Add(new ViewFacilitiesRequirement()));
});

services.AddScoped<IAuthorizationHandler, ViewFacilitiesHandler>();

如果不明显,一个策略可以利用多个要求。所有这些都必须通过才能使政策获得通过。处理程序只需在 DI 容器中注册即可。它们会根据其适用的要求类型自动应用。

然后,在需要此权限的 Controller 或操作上:

 [Authorize(Policy = "ViewFacilities")]

当然,这是一个非常基本的示例。您可以创建能够满足多种不同要求的处理程序。您可以进一步构建您的要求,因此您也不需要那么多。或者您可能更喜欢更明确,并对每个特定场景都有要求/处理程序。这完全取决于你。

有关更多详细信息,请参阅documentation .

关于asp.net-core-2.0 - 如何扩展 ASP.NET Core 2.0 的角色以处理不同位置的不同权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49115555/

相关文章:

asp.net-core-webapi - 未为内部服务器错误响应 ASP.NET Core 3.1 设置 CORS header

c# - ASP.NET Core 2 中的 ModelBinder 和日期

c# - 如何在 .Net Core 2.0 中的 WebAPI 上使用 Azure 中的应用程序设置

c# - Postgres 异常 : 23505: duplicate key value violates unique constraint "PK_country"

asp.net-core-mvc - AddEntityFrameworkStores 只能使用派生自 .NET Core 2.0 中的 IdentityRole 的角色调用

angular - 如何为 dotnet 核心(web Api)代码更改以及 TypeScript 代码更改启用实时重新加载

c# - .NET Core RedirectToAction 不重定向

java - Android studio 危险权限

php - IIS7如何设置用户访问网络驱动器目录的权限

c# - 如何创建自定义 Active Directory 权限和组,以便我可以根据此验证用户?