首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当类上有PrincipalPermission时,方法上的PrincipalPermission将被忽略

当类上有PrincipalPermission时,方法上的PrincipalPermission将被忽略
EN

Stack Overflow用户
提问于 2015-10-23 03:27:27
回答 2查看 478关注 0票数 1

我的理解一直是,方法上的安全属性将覆盖类上的安全属性,但似乎不再是这样,正如下面的简单代码所演示的那样:

代码语言:javascript
复制
class Program
{
    [PrincipalPermission(SecurityAction.Demand, Authenticated = true)] //<-- this passes
    class DumbClass
    {
        [PrincipalPermission(SecurityAction.Demand, Role = "ffff")] //<-- this passes (but shouldn't)
        public string EchoMethod(string input)
        {
            return input;
        }
    }

    static void Main(string[] args)
    {
        Thread.CurrentPrincipal = new ClaimsPrincipal(new ClaimsIdentity("manual"));

        //this should throw becuase the principal is not in the role "ffff"
        //BUT DOESN'T
        Console.WriteLine(new DumbClass().EchoMethod("this"));
    }
}

如果我删除了类上的声明,那么我会得到预期的安全异常。我是不是漏掉了什么很明显的东西。我使用的是.Net 4.5

EN

回答 2

Stack Overflow用户

发布于 2018-06-06 04:18:13

由于使用OR组合PrincipalPermissionAttribute请求,并且类属性本质上与将属性添加到每个方法中相同,因此您的示例等同于:

代码语言:javascript
复制
[PrincipalPermission(SecurityAction.Demand, Authenticated = true)] 
class DumbClass
{
    [PrincipalPermission(SecurityAction.Demand, Authenticated = true)] 
    public DumbClass()
    {
    }

    [PrincipalPermission(SecurityAction.Demand, Authenticated = true)] 
    [PrincipalPermission(SecurityAction.Demand, Role = "ffff")]
    public string EchoMethod(string input)
    {
        return input;
    }
}

由于OR逻辑,您对Role="ffff“的要求是多余的。

如果您希望将EchoMethod限制为角色"ffff",并允许所有其他方法使用经过身份验证的用户,请将您的代码更改为:

代码语言:javascript
复制
class DumbClass
{
    [PrincipalPermission(SecurityAction.Demand, Authenticated = true)] 
    public DumbClass()
    {
    }

    [PrincipalPermission(SecurityAction.Demand, Role = "ffff")]
    public string EchoMethod(string input)
    {
        return input;
    }

    [PrincipalPermission(SecurityAction.Demand, Authenticated = true)] 
    public string OtherMethod(string input)
    {
        return input;
    }

}
票数 0
EN

Stack Overflow用户

发布于 2015-10-23 03:44:04

按如下方式更改代码:

代码语言:javascript
复制
[PrincipalPermission(SecurityAction.Demand)] //<-- REMOVE Authenticated = true
class DumbClass
{
    [PrincipalPermission(SecurityAction.Demand, Role = "ffff")] //<-- this passes (but shouldn't)
    public string EchoMethod(string input)
    {
        return input;
    }
}

通过设置Authenticated = true,您可以显式地表明用户已经通过了身份验证,而他们可能已经通过了身份验证,也可能没有通过。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33289100

复制
相关文章

相似问题

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