据我所知,有3个'级别',我可以在我的web应用程序中使用具有角色的授权属性。第一个是webapp的全局认证策略,如下所示:
serviceCollection.AddMvcCore(options =>
{
options.Filters.Add(new AuthorizeFilter("MyPolicy"));
})
.AddAuthorization(options =>
{
options.AddPolicy("MyPolicy", builder =>
{
builder.RequireAuthenticatedUser();
builder.RequireRole(new[]{"MyRole1","MyRole2"});
});
});
这意味着只有使用MyRole1或MyRole2登录的用户才能使用web应用程序。
接下来的两个级别将分别在控制器级别和端点级别使用授权属性,如下所示:
[Authorize(Roles = "MyRole3,MyRole4")]
public class MyController : Controller
{
public MyController(){}
[HttpGet]
[Authorize(Roles = "MyRole5,MyRole6")]
public async Task<IActionResult> Get()
{
var result = "something";
return this.OkOrBadRequest(result);
}
}
在这种情况下,哪些角色应用于端点?所有的角色都是在一起的吗,所有的角色都是在一起的吗,还是"最具体的第一"的情况?
在一直向下的情况下,这意味着从MyRole1到MyRole6的任何角色都可以访问这里的Get端点。
在一直向下的情况下,这意味着用户需要(MyRole1或MyRole2) AND (MyRole3或MyRole4) AND (MyRole5或MyRole6)来访问这里的Get端点
在"most specific first"的情况下这意味着只有MyRole5或MyRole6可以访问端点,而所有其他级别的角色都被忽略。
如果我想在特定级别添加AND,例如在MyController上,我想让它为(MyRole3 || MyRole4) &&MyRole7吗?
授权属性被并列在一起。因此,您应该将授权链读取为MyRole1或MyRole2和MyRole3或MyRole4和MyRole5或MyRole6。由此,您应该能够确定如何访问该操作。
(MyRole1 || MyRole2) && (MyRole3 || MyRole4) && (MyRole5 || MyRole6)
这意味着要访问该方法,您至少需要来自每个组的一个角色。