【问题标题】:Custom CodeAccessSecurityAttribute自定义 CodeAccessSecurityAttribute
【发布时间】:2010-08-27 14:21:55
【问题描述】:

我创建了以下属性:

[Serializable]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class OperationPermissionAttribute : CodeAccessSecurityAttribute
{
    private static PrincipalPermission _revoke = new PrincipalPermission(PermissionState.None);
    private static PrincipalPermission _allow = new PrincipalPermission(PermissionState.Unrestricted);
    private string _role;
    private string _task;
    private string _operation;

    public OperationPermissionAttribute(SecurityAction action, string role, string task, string operation) : base(action)
    {
        _role = role;
        _task = task;
        _operation = operation;
    }

    public OperationPermissionAttribute(string role, string task, string operation)
        : base(SecurityAction.Demand)
    {
        _role = role;
        _task = task;
        _operation = operation;
    }

    public override System.Security.IPermission CreatePermission()
    {
        var principal = System.Threading.Thread.CurrentPrincipal as AzManPrincipal;
        if (principal == null)
            return _revoke;

        bool result = principal.IsOperationAllowed(_role, _task, _operation);
        return result ? _allow : _revoke;
    }
}

我是这样使用的:

    [OperationPermission(SecurityAction.Demand, Roles.Administrator, "UserService", "Remove")]
    public void Add(User user)
    {
        user.ValidateOrThrow();
        _repository.Add(user);
    }

运行代码给我以下错误:

缺少必需的构造函数。 (来自 HRESULT 的异常:0x8013143B),它是一个 COMException。

到底为什么我会得到它,它的真正含义是什么?

【问题讨论】:

  • 我不认识“Roles.Administrator”。您是否尝试在 .NET 4.0 中运行它? CAS 已弃用。
  • 它是一个具有我们自己角色的静态类。
  • 我应该用什么来代替 CAS?
  • @Hans:你的陈述有几个问题。首先,CAS 在 .NET 4.0 中并没有真正被弃用,即使“裸”CLR 主机不再强制执行 CAS 策略。其次,主体权限不是真正的 CAS 权限,并且它们的评估不受 .NET 4.0 中 CAS 策略实施的更改的影响。

标签: c# .net security attributes code-access-security


【解决方案1】:

问题在于您的构造函数定义。您需要用一个仅采用 SecurityAction 参数的构造函数替换现有的两个构造函数。 (参见http://msdn.microsoft.com/en-us/library/system.security.permissions.codeaccesssecurityattribute.aspx 的“继承者注意事项”部分。)其原因在于用于权限属性的反序列化机制。

【讨论】:

    【解决方案2】:

    我会将role 的构造函数参数类型从String 更改为Roles(在这种情况下,您还需要更改其他一些内容)

    public OperationPermissionAttribute(SecurityAction action, Roles role, ...
    

    或在构造函数调用上执行ToString()

    [OperationPermission(SecurityAction.Demand, Roles.Administrator.ToString(), "UserService", "Remove")]
    

    我个人更喜欢第一个选项。

    【讨论】:

    • 我们使用的是我们自己的自定义角色,因此使用了字符串。但这不是我错误的原因吗?
    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多