我可以使用属性使 .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() 返回与登录用户关联的身份。

然后我是否可以使用&lt; runAsLoggedInUser) &gt; public sub doStuff() &gt; 使框架在运行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 属性

将 ASP.NET 核心身份用户属性保存在另一个表中

线程可以作为另一个用户执行吗? (.NET 2.0/3.5)

asp.net web.config 模拟与应用程序池标识

.NET 作为来自另一个域的另一个用户进行远程调试?

您如何在 .NET 中进行模拟?