c# - ASP.NET Core 授权不适用于嵌套角色
问题描述
我在 ASP.NET Core 项目中实现了基于角色的访问控制 (RBAC)。我要求用户至少属于一个 Active Directory 角色,具体取决于代码部署到的环境(DEV、STAGING、PROD)。下面的代码有效。然而,我现在需要使用单个“嵌套”/分组/分层角色,即新角色将其他角色组合在一起,而不是在每个环境中使用多个角色。使用新的 AD 角色不再有效。我已确认我是新角色的成员,但我收到授权错误。我找不到任何在线讨论是否可以在 ASP.NET Core 中使用分组角色。
public void ConfigureServices(IServiceCollection services)
{
try
{
services.AddAuthentication(IISDefaults.AuthenticationScheme);
services.AddMvc().AddApplicationPart(typeof(ProcessController).Assembly).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddRequestScopingMiddleware(() => _scopeProvider.Value = new Scope());
services.AddCustomControllerActivation(Resolve);
services.AddCustomViewComponentActivation(Resolve);
services.AddAuthorization(options =>
{
var policyBuilder = new AuthorizationPolicyBuilder().RequireAuthenticatedUser();
switch (HostingEnvironment.EnvironmentName)
{
case "Development":
policyBuilder.RequireRole("roleA", "roleB");
//policyBuilder.RequireRole("roleAandB");//this doesn't work
break;
case "Staging":
policyBuilder.RequireRole("roleC", "roleD");
break;
case "Production":
policyBuilder.RequireRole("roleE", "roleF");
break;
default:
policyBuilder.RequireRole("roleG");
break;
}
options.AddPolicy("Environment", policyBuilder.Build());
});
}
catch (Exception e)
{
_logger.Error(e, "Unhandled exception");
throw;
}
}
[Authorize(Policy = "Environment")]
public class ProcessController : ControllerBase
{
...
}
如何在 ASP.NET Core 授权中使用嵌套角色?
解决方案
ASP.NET 中所谓的“角色”对应于 Active Directory 中的组。因此,检查 AD 用户是否具有角色实际上是检查用户是否在组中。
假设您想授予“高级用户”访问网站某个部分的权限。您将在 AD 中创建一个名为 的组MyAppPowerUsers
,并将其用作应用程序中的角色:
policyBuilder.RequireRole("MyAppPowerUsers");
然后,您将您认为是“高级用户”的任何人添加到 AD 中的该组。例如,如果您想让所有经理和团队负责人访问您网站的“高级用户”部分,那么您创建名为的组Managers
并将TeamLeads
其添加到MyAppPowerUsers
.
Managers
在这种情况下,任何属于或TeamLeads
将被视为成员的任何用户MyAppPowerUsers
。
所以这个想法是,在大多数情况下,你:
- 在应用程序中创建一个以角色命名的组
- 为职位描述创建组。例如,您甚至可能已经将这些作为分发列表(只要这些 DL 具有“安全”的“组类型”)
- 将职位描述组添加到角色
当然,如果您想将一个人添加到一个角色中,而不是所有具有其职位描述的人,则可能会有例外。
推荐阅读
- php - 如何在 PHP 中将多维数组输出到 CSV 文件?
- python - 在python中,是否可以为变量创建“快捷方式”。那么如果变量改变了,快捷方式也会改变吗?
- python - 使用 python 进行二进制搜索和值检查
- snowflake-cloud-data-platform - 使用横向展平和连接会导致语法错误
- keras - val_loss 和 loss 不减少 u-net
- c# - 在客户端计算机 C# 上查看/下载内容到 Outlook
- javascript - SyntaxError:意外的标识符 - GraphQLService
- php - 上传烘焙的 Wordpress 网站
- javascript - 外部导出与项目的内部导出
- laravel - 如何使用一种方法注销任何警卫?