自codeAccessSecurityAttribute [英] Custom CodeAccessSecurityAttribute
问题描述
我已经创建了以下属性:
I've created the following attribute:
[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;
}
}
我用这样的:
which I use like this:
[OperationPermission(SecurityAction.Demand, Roles.Administrator, "UserService", "Remove")]
public void Add(User user)
{
user.ValidateOrThrow();
_repository.Add(user);
}
运行code使我有以下错误:
Running the code gives me the following error:
缺少必需的构造。 (从HRESULT异常:0x8013143B)。,它的一个收到COMException
Missing a required constructor. (Exception from HRESULT: 0x8013143B), its a COMException.
为什么在地球上我得到它,这是什么意思呢?
why on earth do I get it and what does it really mean?
推荐答案
问题出在构造函数的定义。您需要通过一个构造函数,只需SecurityAction的说法来取代你的两个现有的构造函数。 (参见对继承部分<一个href="http://msdn.microsoft.com/en-us/library/system.security.permissions.$c$caccesssecurityattribute.aspx">http://msdn.microsoft.com/en-us/library/system.security.permissions.$c$caccesssecurityattribute.aspx.)这样做的原因在于用于许可属性反序列化机制
The problem lies in your constructor definitions. You need to replace your two existing constructors by a single constructor that takes only a SecurityAction argument. (See the "Notes to Inheritors" section at http://msdn.microsoft.com/en-us/library/system.security.permissions.codeaccesssecurityattribute.aspx.) The reason for this lies in the deserialization mechanism used for permission attributes.
这篇关于自codeAccessSecurityAttribute的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!