你不能那样做。[Authorize(Roles=//set dynamically)]
必须在编译时知道。正如吹镖的评论链接帖子中指出的那样,不鼓励出于这个原因使用角色。
相反,您应该使用声明和政策。声明是细粒度的权限,例如“CreateCustomer”或“DeleteCustomer”或“ViewDashboard”。
所以你必须像使用它一样
[Authorize(Policy = "ViewDashboard")]
这些策略需要在编译时知道。
public class ViewDashboardRequirement : AuthorizationHandler<ViewDashboardRequirement>, IAuthorizationRequirement
{
public override void Handle(AuthorizationContext context, ViewDashboardRequirement requirement)
{
if (context.User.HasClaim(c => c.Type == "dashboard:read"))
{
context.context.Succeed(requirement);
return;
}
// only call fail if you do not want that other AuthorizationHandler may succeed with
// a different requirement
// context.Fail();
}
}
有关如何生成通用处理程序(而不是为每个策略编写新的处理程序)的示例,请参见我的答案。
这将允许您创建可配置的角色。现在您可以创建由声明包组成的角色。每个索赔可能是一个政策。当用户登录时,您将属于某个角色的声明添加到用户声明列表中。
IE
- 支持:ViewDashboard、ViewCustomers、ViewContacts、ManageCases(支持票)
- 经理:ViewDashboard、ManageCustomers(查看、编辑、删除)、ManageContacts(查看、编辑、删除)
- 管理员:ManageDashboard(查看、编辑)
等等
从评论更新。
您应该能够使用 ASP.NET Core Identity 的声明和角色声明功能,而无需更改一行代码,因此您拥有IdentityRole
和IdentityRoleClaim
类。在运行时,您添加一个新的IdentityRole
(即“管理器”),然后添加多个IdentityRoleClaim
(每个权限/策略一个)