我可以使用属性使.net模仿其他用户吗?

时间:2010-06-08 18:47:07

标签: .net attributes impersonation

我熟悉使用以下方式在.net中模拟帐户:

dim myIdentity as WindowsIdentity = someIdentity  
using ctx as WindowsImpersonationContext = myIdentity.Impersonate()  
    doStuff()  
end using

是否可以定义.net属性,以便我可以编写类似:

的内容
< runAsUser(someIdentity) > public sub doStuff()

然后在运行方法doStuff()时,.net框架始终是模拟的吗?

更新的 好的,我被告知这可能是不可能的,因为属性构造函数的参数必须是常量,这将排除传递用户身份。

让我稍微改一下问题: 假设有一个函数getUserWindowsIdentity()返回与登录用户关联的标识。

然后我可以使用< runAsLoggedInUser) > public sub doStuff() >使框架在运行getUserWindowsIdentity方法时始终模拟doStuff()返回的用户ID吗?

5 个答案:

答案 0 :(得分:2)

不,.NET框架中不存在这样的魔力。您必须自己编写代码,使用Reflection来读取属性。该代码看起来很像你已经拥有的代码,只是速度慢,并且代码可以读取添加的属性。

答案 1 :(得分:1)

我很确定无法做到这一点。您可以使用PostSharp(或类似的)

来模拟它

传递给Attribute构造函数的参数必须是常量,这意味着它们根本不能是引用类型。我会质疑代码块应始终在相同的硬编码凭证下运行的用例。

答案 2 :(得分:1)

如果你控制:a)调用doStuff()方法的代码或b)doStuff()的调用者获取对实现doStuff()的对象/类的引用的方法,那么你可以完成你正在寻找的东西。项目b)是首选。

如果可能,请查看动态代理 - http://www.castleproject.org/dynamicproxy/index.html。而不是返回有问题的对象/类的实际实例,而是返回实例的代理。当调用者调用该方法时,代理首先看到它。在代理的实现中,查找正在调用的方法的属性,如果找到,则启动模拟。

答案 3 :(得分:1)

正如其他人已经回答的那样,你可以创建一个“工作”的属性,但是没有明确说明的是没有你可以创建的自定义属性,运行时或框架组件将在你的上执行代表。因此,您可以创建一个属性,例如:

public class RunAsUserAttribute : Attribute
{
    // implement some attribute functionality here
}

然后您可以在方法或类上使用该属性:

[RunAsUser]
public void DoStuff()
{
    // do some stuff as the impersonated user
} 

哪个组件将调用RunAsUserAttribute类中的功能?您可以将此类功能放在soccerdad建议的动态代理中。这是解决问题的一种方法。

干杯。

答案 4 :(得分:0)

我不是专家,所以我会向其他回答者承认你不能按照你建议的方式做到这一点,但是你可能能够编写看起来像你想要的代码与您使用的代码一样快。

如果您在预处理程序指令中编写使用using块替换属性标记,那么您几乎可以充分利用这两个方面。这可以通过运行在源代码上的脚本来实现。