使用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。