我已经在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授权中使用嵌套角色?
答案 0 :(得分:1)
在ASP.NET中所谓的“角色”对应于Active Directory中的组。因此,检查AD用户是否具有角色实际上是在检查该用户是否在组中。
假设您要授予“高级用户”访问网站特定部分的权限。您将在AD中创建一个名为MyAppPowerUsers
的组,并将其用作应用程序中的角色:
policyBuilder.RequireRole("MyAppPowerUsers");
然后,将您认为“高级用户”的任何人添加到AD中的该组。例如,如果您想让所有经理和团队领导访问您网站的“高级用户”部分,则可以创建名为Managers
和TeamLeads
的组并将其添加到MyAppPowerUsers
在这种情况下,属于Managers
或TeamLeads
成员的任何用户都将被视为MyAppPowerUsers
的成员。
因此,在大多数情况下,您的想法是:
如果要在一个角色中添加一个人,而不是所有人都带有其职务说明,那么当然可以例外。