2010-08-27 4 views
8

tôi đã tạo ra các thuộc tính sau:Tuỳ chỉnh CodeAccessSecurityAttribute

[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; 
    } 
} 

mà tôi sử dụng như thế này:

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

Chạy mã mang lại cho tôi những lỗi sau:

Thiếu một yêu cầu constructor. (Ngoại lệ từ HRESULT: 0x8013143B), là một ngoại lệ của nó.

lý do tại sao tôi nhận được nó và nó thực sự có ý nghĩa gì?

+0

Tôi không nhận ra 'Vai trò. Quản trị viên'. Bạn có cố gắng để chạy này trong .NET 4.0? CAS không được chấp nhận. –

+0

Lớp tĩnh của nó với vai trò riêng của chúng tôi. – jgauffin

+0

Tôi nên sử dụng gì thay vì CAS? – jgauffin

Trả lời

8

Sự cố nằm trong định nghĩa hàm tạo của bạn. Bạn cần phải thay thế hai hàm tạo hiện có của bạn bằng một hàm tạo duy nhất chỉ nhận một đối số SecurityAction. (Xem phần "Ghi chú để thừa kế" tại http://msdn.microsoft.com/en-us/library/system.security.permissions.codeaccesssecurityattribute.aspx.) Lý do cho điều này nằm trong cơ chế deserialization được sử dụng cho các thuộc tính quyền.

0

tôi sẽ hoặc thay đổi kiểu tham số constructor cho roleString-Roles (trong trường hợp này bạn sẽ cần phải thay đổi một vài điều khác nữa)

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

hoặc làm ToString() trên gọi constructor:

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

Cá nhân tôi muốn tùy chọn đầu tiên.

+0

Chúng tôi đang sử dụng vai trò tùy chỉnh của riêng mình, do đó việc sử dụng các chuỗi. Nhưng đó không phải là nguyên nhân gây ra lỗi của tôi? – jgauffin