我可以使用属性使 .net 模拟另一个用户吗?
Posted
技术标签:
【中文标题】我可以使用属性使 .net 模拟另一个用户吗?【英文标题】:Can I use a attribute to make .net impersonate another user? 【发布时间】:2010-06-08 18:47:07 【问题描述】:我熟悉使用以下方法在 .net 中模拟帐户:
dim myIdentity as WindowsIdentity = someIdentity
using ctx as WindowsImpersonationContext = myIdentity.Impersonate()
doStuff()
end using
是否可以定义一个 .net 属性,以便我可以编写如下内容:
< runAsUser(someIdentity) > public sub doStuff()
然后让.net 框架在运行doStuff()
方法时始终模拟?
更新 好的,有人告诉我这可能是不可能的,因为属性构造函数的参数必须是常量,这会排除传入用户身份的可能性。
让我问这个问题有点不同:
假设有一个函数 getUserWindowsIdentity()
返回与登录用户关联的身份。
然后我是否可以使用< runAsLoggedInUser) > public sub doStuff() >
使框架在运行doStuff()
方法时始终模拟getUserWindowsIdentity
返回的用户ID?
【问题讨论】:
【参考方案1】:不,.NET 框架中不存在这样的魔法。您必须自己编写代码,使用反射来读取属性。该代码看起来很像您已经拥有的代码,只是速度较慢,并且添加了读取属性的代码。
【讨论】:
我认为他不是在问它是否存在,而是在可能定义这样一个属性/标签来做到这一点。【参考方案2】:我很确定这是不可能的。你也许可以用PostSharp(或类似的)来模拟它。
传递给Attribute
构造函数的参数必须是常量,这意味着它们根本不能是引用类型。我会质疑代码块也应该始终在相同的硬编码凭据下运行的用例。
【讨论】:
如果不传入 ref 参数很容易获得,是否可以对属性类进行编码以查找身份? 是的,但是您仍然需要其他代码来处理该属性并实际使用它。作为一般规则,属性用作从其他代码反映的标记。调用您的方法的代码需要加载和处理属性,并实际执行模拟。如果您从同一位置调用多个方法,每个方法都需要在不同的预定义凭据下运行,那么我可以看到一些潜在的好处。【参考方案3】:如果您控制:a) 调用 doStuff() 方法的代码或 b) doStuff() 的调用者获取对实现 doStuff() 的对象/类的引用的方法,那么您可以完成你正在寻找的东西。 b) 项是首选。
如果可能,请查看动态代理 - http://www.castleproject.org/dynamicproxy/index.html。与其返回相关对象/类的实际实例,不如返回该实例的代理。当调用者调用该方法时,代理首先看到它。在代理的实现中,在被调用的方法上查找您的属性,如果找到,则启动模拟。
唐尼
【讨论】:
【参考方案4】:正如其他人已经回答的那样,您可以创建一个“工作”的属性,但没有明确说明的是,您没有可以创建运行时或框架组件将在您的代表。因此,您可以创建一个属性,例如:
public class RunAsUserAttribute : Attribute
// implement some attribute functionality here
然后您可以在方法或类上使用该属性:
[RunAsUser]
public void DoStuff()
// do some stuff as the impersonated user
哪个组件将调用 RunAsUserAttribute 类中的功能?您可以按照 footballdad 的建议将这种功能放在动态代理中。这是解决问题的一种方法。
干杯。
【讨论】:
【参考方案5】:我不是专家,所以我向其他回答者承认,您不能按照您建议的方式执行此操作,但您也许可以编写看起来符合您希望的代码 并且与您一直使用的代码一样快。
如果您编写预处理器指令以用 using 块替换属性标记,您几乎可以两全其美。这也可以通过在您的源代码上运行的脚本来实现。
【讨论】:
以上是关于我可以使用属性使 .net 模拟另一个用户吗?的主要内容,如果未能解决你的问题,请参考以下文章
从另一个项目/dll 引用的 Asp.NET 用户控件具有 NULL 属性