使用剃须刀页面覆盖.net Core 2中的授权策略

时间:2019-09-06 15:25:01

标签: c# asp.net-core razor-pages

我有一个关于授权策略如何在.net core 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,则它起作用。但是,这又不是我想要的。

有没有办法使这项工作有效?在这种情况下,文档会少一些帮助。

是的,我知道我可以通过拥有用于管理页面的管理文件夹并将其锁定来达到需要的位置。或其他多种方法来确保安全性。但是,为将来参考,我真的很想知道策略在这样重叠时如何相互影响。

1 个答案:

答案 0 :(得分:0)

对于您的方案,覆盖授权策略是不合理的,您应该通过判断页面的应用程序根目录相对路径以及用户具有的声明来定制策略,如下所示:

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);