Как предотвратить использование метода С# с помощью средства проверки атрибутов?

Я хотел бы создать валидатор на основе атрибутов, который проходит несколько шагов за пределы того, что я видел в примерах. Это в основном предотвратит выполнение методов или других функций.

Имейте в виду, что мне нужно использовать AzMan, поскольку в этом случае у меня нет доступа к Active Directory.

Вот какой-то псевдо-код того, что я ищу:

// Attribute validator class AttributeUsage is arbitrary at this point and may include other items
[AttributeUsage( AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true, Inherited = true )]
public class PermissionsValidatorAttribute : Attribute
{
 public PermissionsValidatorAttribute(PermissionEnumeration permission){...}
 public bool UserCanCreateAndEdit(){...}
 public bool UserCanDelete(){...}
 public bool UserCanUpload(){...}
}

Здесь образец образца/члена, который будет украшен. Метод не будет выполнен вообще, если PermissionValidator.UserCanDelete() не возвращает true из того места, где он выполнялся:

public class DoStuffNeedingPermissions
{
 [PermissionValidator(PermissionEnumeration.MustHaveDeletePermission)]
 public void DeleteSomething(){...}
}

Я знаю, что это простой, неполный пример. Но вы должны понять суть того, что мне нужно. Предположим, что DeleteSomething() уже существует, и я предпочитаю НЕ изменять код внутри метода вообще.

В настоящее время я смотрю на такие вещи, как блок приложений проверки, и я возился с пользовательскими атрибутами POC. Но я бы хотел услышать мнения с образцами кода от всех там. Я также, конечно, не против других методов достижения того же самого, таких как методы расширения или что-то, что может работать для достижения того же самого. Пожалуйста, помните, что я пытаюсь свести к минимуму изменения существующего кода DoStuffNeedingPermissions. Спасибо всем!

2 ответа

Есть ли причина, по которой вы не рассматриваете PrincipalPermissionAttribute?

[PrincipalPermissionAttribute(SecurityAction.Demand, Name="Bob",
Role="Supervisor")]


Я думаю, что ключ не должен меняться DoStuffNeedingPermissions. Вам нужно будет изменить все, что вызывает методы этого класса, чтобы они проверяли разрешения. Это, очевидно, навязчиво. Если бы мне пришлось использовать атрибуты, я бы посмотрел на использование возможностей перехвата структуры AOP, чтобы обернуть вызов выполнения и проверить его там. Это работает, потому что безопасность - это архетипический случай проблем с перекрестными ограничениями.

licensed under cc by-sa 3.0 with attribution.