Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用CodeAccessSecurity的WCF声明性安全性_Wcf_Authorization_Code Access Security - Fatal编程技术网

使用CodeAccessSecurity的WCF声明性安全性

使用CodeAccessSecurity的WCF声明性安全性,wcf,authorization,code-access-security,Wcf,Authorization,Code Access Security,我计划使用基于CodeAccessSecurity的自定义权限声明式授权机制。为了实现它,我创建了以下派生自CodeAccessSecurityAttribute的子类: [Serializable] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = false)] public class RequirePermissionAttribute :

我计划使用基于
CodeAccessSecurity
的自定义权限声明式授权机制。为了实现它,我创建了以下派生自
CodeAccessSecurityAttribute
的子类:

[Serializable]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = false)]
public class RequirePermissionAttribute : CodeAccessSecurityAttribute {

    private static readonly IPermission _deny = new SecurityPermission(PermissionState.None);
    private static readonly IPermission _allow = new SecurityPermission(PermissionState.Unrestricted);

    public RequirePermissionAttribute(SecurityAction action)
        : base(action) {
    }

    public string Permission { get; set; }

    public override IPermission CreatePermission() {
        if (User.HasPermission(Permission))
            return _allow;
        else
            return _deny;
    }
}
我这样使用它:

[ServiceContract]
public class Service {

    [OperationContract]
    [RequirePermission(SecurityAction.Demand, Permission = "GetArbitaryProduct")]
    public User GetProduct(string name) {
        return _productRepository.Get(name);
    }
}

我预计如果
CreatePermission
方法返回
\u deny
GetProduct
的访问将受到限制。但是看起来,
CodeAccessSecurity
不是这样工作的。我是否必须抛出异常才能正确限制访问?或者可能有更优雅的方法来实现这一点?

基于CodeAccessSecurityAttribute子类实例连接权限验证的CLR机制只会在计算CreatePermission()返回的权限时引发异常时阻止执行目标方法。由于将SecurityAction.Demand指定为权限操作,这意味着权限的Demand()方法必须抛出,以避免执行目标方法


还有很多其他方法可以处理授权场景,其中许多方法可能更“优雅”。然而,在开始寻找替代方法之前,最好考虑当拒绝授权时,服务调用方应该遵守的行为。您希望方法成功但返回null,还是希望返回错误?如果是后者,是否希望它是类型错误?

基于CodeAccessSecurityAttribute子类实例连接权限验证的CLR机制仅在计算CreatePermission()返回的权限时引发异常时才会阻止执行目标方法。由于将SecurityAction.Demand指定为权限操作,这意味着权限的Demand()方法必须抛出,以避免执行目标方法


还有很多其他方法可以处理授权场景,其中许多方法可能更“优雅”。然而,在开始寻找替代方法之前,最好考虑当拒绝授权时,服务调用方应该遵守的行为。您希望方法成功但返回null,还是希望返回错误?如果是后者,您是否希望它是一个类型错误?

目前,这无关紧要,我对调用方没有任何要求,因此我可以随意实现它。但是我认为类型化错误是首选的。如果您更喜欢类型化错误,那么使用默认路径允许您的权限抛出SecurityException可能是最简单的方法。这将导致WCF内部自动生成一个错误,该错误映射到WCF客户端()中的SecurityAccess-DeniedException。目前,这无关紧要,我对调用方没有任何要求,所以我可以随意实现它。但是我认为类型化错误是首选的。如果您更喜欢类型化错误,那么使用默认路径允许您的权限抛出SecurityException可能是最简单的方法。这将导致WCF内部自动生成一个故障,该故障映射到WCF客户端()中的SecurityAccess-DeniedException。