【问题标题】:WCF declarative security using CodeAccessSecurity使用 CodeAccessSecurity 的 WCF 声明式安全性
【发布时间】:2011-09-02 16:16:25
【问题描述】:

我计划使用基于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 方法返回_deny 访问GetProduct 将受到限制。但看起来CodeAccessSecurity 不是这样工作的。我是否必须抛出异常才能正确限制访问?或者也许有更优雅的方式来实现这一目标?

【问题讨论】:

    标签: wcf authorization code-access-security


    【解决方案1】:

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

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

    【讨论】:

    • 目前没关系,我对调用者没有任何要求,所以我可以随意实现。但我认为类型错误是首选。
    • 如果您更喜欢类型错误,那么允许您允许抛出 SecurityException 的默认路径可能是最简单的方法。这将导致 WCF 内部自动生成一个错误,该错误映射到 WCF 客户端 (msdn.microsoft.com/en-us/magazine/cc948343.aspx#id0070004) 中的 SecurityAccessDeniedException。
    猜你喜欢
    • 2010-09-18
    • 2014-06-08
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 2013-09-23
    • 2013-06-25
    • 1970-01-01
    • 2019-10-14
    相关资源
    最近更新 更多