如何在 Asp.Net 核心控制器中使用基于策略和基于角色?

How to use either Policy based and Role based in Asp.Net Core controller?

我在控制器中设置我的授权是这样的:

[Authorize(Role= "Admin", Policy = "EmployeeOnly")]
public IActionResult VacationBalance()
{
    return View();
}

//configure services..
services.AddAuthorization(options =>
{
        options.AddPolicy("EmployeeOnly", policy => policy.RequireClaim("EmployeeNumber"));
});

现在,当我以管理员用户身份登录时。意思是我有 "Admin" 角色。我希望我可以访问 VacationBalance 控制器,因为我具有管理员角色。但不幸的是,我无法访问该页面,并且收到了禁止回复。 我希望可以通过 "Admin" 角色或 "EmployeeOnly" 声明访问此控制器。 它是这样工作的吗?

感谢您的帮助。

这将使只有具有 EmployeeNumberAdmin 角色的用户才能访问 VacationBalance 操作,为了达到您的要求,您可以创建另一个策略来检查:

services.AddAuthorization(options =>
{
    options.AddPolicy("EmployeeOrAdmin", policy =>
    {
        policy.RequireAssertion(context =>
        {

            var isEmployee = context.User.HasClaim(c=>c.Type== "EmployeeNumber");
            var roles= context.User.Claims.Where(x => x.Type == ClaimTypes.Role).ToList();
            var isAdmin = roles.Any(str => str.Value.Equals("Admin"));

            return isEmployee || isAdmin ;
        });
    });
});

然后将策略应用于您受保护的操作:

[Authorize( Policy = "EmployeeOrAdmin")]