我们正在 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/