我有一个关于如何在.net核心2中重叠/覆盖授权策略的问题。
基本上,我想设置一个策略,默认情况下,所有页面都需要管理员访问权限,然后让某些部分显式地向常规用户开放。这样,默认情况下,任何新的部分都会被锁定。
因此,在服务设置部分,我设置了策略:
services.AddAuthorization(options =>
{
options.AddPolicy("ValidUser",
policy => policy.RequireClaim("Type")); //any valid user
options.AddPolicy("AdministratorsOnly",
policy => policy.RequireClaim("Type",UserType.Administrator.ToString()));
});然后是剃刀页面选项:
services.AddMvc()
.AddRazorPagesOptions(options =>
{
options.Conventions.AuthorizeFolder("/","AdministratorsOnly");
options.Conventions.AuthorizeFolder("/UserFolder", "ValidUsers");
});但是,ValidUsers策略不会覆盖上面设置的综合AdministratorsOnly策略。如果我在/UserFolder上使用AllowAnonymousToFolder,这将否定管理员的策略,但显然这不是我想要的。
如果我颠倒方向,将覆盖策略设置为ValidUsers,并将"override“设置为AdministratorsOnly,那么它就可以工作了。但同样,这不是我想要的。
有没有办法做到这一点呢?在这种情况下,文档的用处不大。
是的,我知道我可以通过为管理页面设置管理文件夹并以这种方式锁定它们来实现我的目标。或任何数量的其他方法来确保安全性。但为了将来的参考,我真的想知道当它们像这样重叠时,策略是如何相互作用的。
发布于 2019-09-09 18:06:32
对于您的场景,覆盖授权策略是不合理的,您应该通过判断页面的应用根相对路径和用户拥有的如下声明来定制策略:
services.AddAuthorization(options =>
{
options.AddPolicy("UserCheck", policy =>
{
policy.RequireAssertion(context =>
{
var path = ((PageActionDescriptor)((ActionContext)context.Resource).ActionDescriptor).RelativePath;
if (path.StartsWith("/Pages")
&& context.User.HasClaim("Type", UserType.Administrator.ToString()))
{
return true;
}
else if(path.StartsWith("/Pages/Admin/User")
&& context.User.HasClaim(c => c.Type == "Type"))
{
return true;
}
return false;
});
});
});
services.AddMvc()
.AddRazorPagesOptions(options =>
{
//options.Conventions.AuthorizeFolder("/Admin/User", "UserCheck");
options.Conventions.AuthorizeFolder("/Admin", "UserCheck");
})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);https://stackoverflow.com/questions/57824790
复制相似问题