2010-03-22 25 views
3

我想创建一个基于属性的验证程序,它比我在示例中看到的要多出几步。它基本上会阻止方法或其他功能的执行。如何防止使用属性验证程序执行C#方法?

请注意,我必须使用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()不返回从无论它的执行真正的被执行:

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

我知道这是一个简单的,不完整的例子。但你应该清楚我所需要的东西。假设DeleteSomething()已经存在,我宁愿不修改方法中的代码。

我目前正在查看诸如验证应用程序块之类的东西,并且正在搞乱自定义属性POC。但我很想听听来自所有人的代码示例的意见。我当然也不反对完成同样事情的其他方法,例如扩展方法或可能用于完成相同事情的任何方法。请记住我正在尝试尽量减少对现有DoStuffNeedingPermissions代码的更改。感谢大家!

+0

您是否考虑过使用基于角色的安全性?例如,用户可以处于多种角色,如CanDelete,CanUpload。 DeleteSomething()可以检查用户是否处于适当的角色。 – 2010-03-22 14:49:58

+0

我实际上是在用你的建议来使用AzMan。但是我仍然需要以尽可能不侵入的方式来实现它。我试图让开发人员不必关心他们的DeleteSomething()类型的方法。我正在寻找更多的“automagic”。 – Boydski 2010-03-22 15:07:07

回答

4

有没有理由不考虑PrincipalPermissionAttribute

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

我的歉意,但我没有提到我在这种情况下不得不使用AzMan。我只是编辑细节来反映这一点。 – Boydski 2010-03-22 15:03:39

+0

应该无关紧要,因为这将检查当前的委托人以确定权限。只要校长正确设置,你就应该是金。 – Josh 2010-03-22 15:15:16

+0

小心告诉反正怎么做这样的事情?通过前20个谷歌搜索结果找不到任何东西,只是人们推荐已有的工具。 – Azarus 2017-04-21 18:03:00

1

我觉得关键不是要改变DoStuffNeedingPermissions.你将不得不修改调用类的方法,让他们检查的权限的一切。这显然是侵入性的。如果我使用属性,我会看看使用AOP框架的拦截功能,以包裹执行调用,并在那里检查。这是有效的,因为安全性是一个横切关注的典型案例。