首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用razor页面覆盖.net核心2中的授权策略

使用razor页面覆盖.net核心2中的授权策略
EN

Stack Overflow用户
提问于 2019-09-06 23:25:02
回答 1查看 368关注 0票数 0

我有一个关于如何在.net核心2中重叠/覆盖授权策略的问题。

基本上,我想设置一个策略,默认情况下,所有页面都需要管理员访问权限,然后让某些部分显式地向常规用户开放。这样,默认情况下,任何新的部分都会被锁定。

因此,在服务设置部分,我设置了策略:

代码语言:javascript
运行
复制
 services.AddAuthorization(options =>
        {
            options.AddPolicy("ValidUser",
                policy => policy.RequireClaim("Type"));  //any valid user
            options.AddPolicy("AdministratorsOnly", 
                policy => policy.RequireClaim("Type",UserType.Administrator.ToString()));
        });

然后是剃刀页面选项:

代码语言:javascript
运行
复制
services.AddMvc()
.AddRazorPagesOptions(options =>
{
    options.Conventions.AuthorizeFolder("/","AdministratorsOnly");

    options.Conventions.AuthorizeFolder("/UserFolder", "ValidUsers"); 

});

但是,ValidUsers策略不会覆盖上面设置的综合AdministratorsOnly策略。如果我在/UserFolder上使用AllowAnonymousToFolder,这将否定管理员的策略,但显然这不是我想要的。

如果我颠倒方向,将覆盖策略设置为ValidUsers,并将"override“设置为AdministratorsOnly,那么它就可以工作了。但同样,这不是我想要的。

有没有办法做到这一点呢?在这种情况下,文档的用处不大。

是的,我知道我可以通过为管理页面设置管理文件夹并以这种方式锁定它们来实现我的目标。或任何数量的其他方法来确保安全性。但为了将来的参考,我真的想知道当它们像这样重叠时,策略是如何相互作用的。

EN

回答 1

Stack Overflow用户

发布于 2019-09-09 18:06:32

对于您的场景,覆盖授权策略是不合理的,您应该通过判断页面的应用根相对路径和用户拥有的如下声明来定制策略:

代码语言:javascript
运行
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57824790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档