ASP.NET 核心授权不适用于嵌套角色
ASP.NET Core authorization not working for nested roles
我在 ASP.NET 核心项目中实施了基于角色的访问控制 (RBAC)。我要求用户至少属于一个 Active Directory 角色,具体取决于代码部署到的环境(DEV、STAGING、PROD)。下面的代码有效。但是,我现在需要使用单个 "nested"/grouped/hierarchical 角色,而不是在每个环境中使用多个角色,即将其他角色组合在一起。使用新的 AD 角色不再有效。我已确认我是新角色的成员,但我收到授权错误。如果可以在 ASP.NET 核心中使用分组角色,我在网上找不到任何讨论。
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核心授权中使用嵌套角色?
ASP.NET中的"roles"对应Active Directory中的组。所以检查AD用户是否有角色实际上是检查用户是否在一个组中。
假设您想要 "power users" 访问网站的某个部分。您将在 AD 中创建一个名为 MyAppPowerUsers
的组,并将其用作您的应用程序中的角色:
policyBuilder.RequireRole("MyAppPowerUsers");
然后您将您认为 "power users" 的任何人添加到 AD 中的该组。例如,如果您想让所有经理和团队领导访问您网站的 "power users" 部分,则您可以创建名为 Managers
和 TeamLeads
的组并将其添加到 MyAppPowerUsers
.
在这种情况下,属于 Managers
或 TeamLeads
成员的任何用户都将被视为 MyAppPowerUsers
的成员。
所以我的想法是,在大多数情况下,您:
- 创建一个以您应用程序中的角色命名的组
- 为职位描述创建群组。例如,您甚至可能已经拥有这些作为通讯组列表(只要这些 DL 的 "Group type" 为 "Security")
- 将职位描述组添加到角色
当然,如果您想将一个人添加到一个角色而不是所有具有其职位描述的人,当然也有例外。
我在 ASP.NET 核心项目中实施了基于角色的访问控制 (RBAC)。我要求用户至少属于一个 Active Directory 角色,具体取决于代码部署到的环境(DEV、STAGING、PROD)。下面的代码有效。但是,我现在需要使用单个 "nested"/grouped/hierarchical 角色,而不是在每个环境中使用多个角色,即将其他角色组合在一起。使用新的 AD 角色不再有效。我已确认我是新角色的成员,但我收到授权错误。如果可以在 ASP.NET 核心中使用分组角色,我在网上找不到任何讨论。
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核心授权中使用嵌套角色?
ASP.NET中的"roles"对应Active Directory中的组。所以检查AD用户是否有角色实际上是检查用户是否在一个组中。
假设您想要 "power users" 访问网站的某个部分。您将在 AD 中创建一个名为 MyAppPowerUsers
的组,并将其用作您的应用程序中的角色:
policyBuilder.RequireRole("MyAppPowerUsers");
然后您将您认为 "power users" 的任何人添加到 AD 中的该组。例如,如果您想让所有经理和团队领导访问您网站的 "power users" 部分,则您可以创建名为 Managers
和 TeamLeads
的组并将其添加到 MyAppPowerUsers
.
在这种情况下,属于 Managers
或 TeamLeads
成员的任何用户都将被视为 MyAppPowerUsers
的成员。
所以我的想法是,在大多数情况下,您:
- 创建一个以您应用程序中的角色命名的组
- 为职位描述创建群组。例如,您甚至可能已经拥有这些作为通讯组列表(只要这些 DL 的 "Group type" 为 "Security")
- 将职位描述组添加到角色
当然,如果您想将一个人添加到一个角色而不是所有具有其职位描述的人,当然也有例外。