Tridion 如何检测代码是否应模拟?

Tridion 如何检测代码是否应模拟?,tridion,Tridion,我的代码作为事件处理程序的一部分运行,需要创建一个新的TOM.NET会话(我不能重用subject.session)。此事件处理程序加载到许多Tridion进程(TcmServiceHost、COM+、Publisher、TcmTemplateDebugHost、IIS应用程序池)中,这些进程可能: 在有权访问Tridion的身份下运行(例如,COM+应用程序在作为Tridion管理员的MTSUser下运行) 在一个身份下运行,该身份无权访问Tridion,但允许模拟Tridion用户(例如,

我的代码作为事件处理程序的一部分运行,需要创建一个新的TOM.NET会话(我不能重用
subject.session
)。此事件处理程序加载到许多Tridion进程(TcmServiceHost、COM+、Publisher、TcmTemplateDebugHost、IIS应用程序池)中,这些进程可能:

  • 在有权访问Tridion的身份下运行(例如,COM+应用程序在作为Tridion管理员的MTSUser下运行)
  • 在一个身份下运行,该身份无权访问Tridion,但允许模拟Tridion用户(例如,TcmServiceHost作为NetworkService运行,配置为Tridion模拟用户)
我尝试使用以下TOM.NET代码来满足这两种情况:

Session session = null;
try
{
    session = new Session();
}
catch (AccessDeniedException ex)
{
    // this process doesn't have TCM access, so impersonate a user that does
    session = new Session("Administator");
}
if (session != null)
{
    var item = session.GetObject(id);
    ...
这是检查我的代码是否在有权访问Tridion的进程下运行的正确方法(忽略我硬编码“Administrator”的事实)吗?代码是有效的,但我只是想知道是否有更有效的方法来执行“hasaccesstotridion”检查


注意:当我使用核心服务访问Tridion时,也会出现同样的问题,因此,问题不在于TOM.NET是否是这里使用的正确API。

这段代码对我来说似乎相当有效-但通过检查是否可以创建会话对象,绝不能保证代码能够执行您希望在CMS中实际执行的操作


这类代码似乎还在创建一个巨大的安全漏洞,允许进程在没有权限时退回到更高的安全级别。还请记住,如果您正在修改CMS中的任何项目,该模拟将导致不显示可能触发更改的个人的真实姓名。它将存储为您模拟的用户。

我不会使用此代码。异常捕获速度很慢,您当前正在向无法访问系统的任何人授予(管理员)访问权限,这是一个很大的安全漏洞

相反,我会查看当前用户是谁,并确定他是否是模拟用户。如果没有API,您可以直接从Tridion.ContentManager.config文件中读取模拟用户(我没有检查)


或者,您可以为您的事件代码单独配置它。或者甚至是硬编码,如果你不关心代码是否通用。

首先,这是一个很好的问题/主题

我认为您正在尝试“构建”一些通用的东西,可以在每个Tridion过程中工作。在我看来,您应该知道何时处于某个流程中,因为根据最佳实践(R&D/you),我们不应该创建会话对象,而是在那些无法访问会话对象的流程中使用核心服务,并在可能的情况下重用可用的会话

例如,正如您在模板和事件系统中所知道的,我们可以访问会话,因此我们应该重用它(除非我们想做用户不允许做的事情,在这种情况下我们应该模拟)

如果在另一个进程中会话不可用,则应使用核心服务

所以我对你问题的回答是不要使用TOM.NET。我将改变我的方法,并使用核心服务构建它,在这里我可以模拟我之前配置的特定用户。您的代码将更加通用,并且将“到处”运行(但不是在烤面包机中)

我理解您在这里试图识别的内容,“谁在运行我当前的流程”?所以你可以相应地模仿

不幸的是(AFAIK),您必须编写一些代码来查看谁是运行进程的身份,然后进行相应的模拟。这很棘手,这也是我建议使用核心服务而不是TOM.NET API的原因


希望这是有意义的。

当TDSE.Impersonate()方法最初实现时,它被有意设计为在调用线程标识不是模拟用户的情况下以静默方式失败。例如,这允许当时GUI中的ASP代码盲目尝试模拟(基于远程用户头IIRC)。关键是,如果你不是模拟用户,好吧,你可以做你自己,但如果你是,你可以/会模拟

我刚刚用COM API测试了这一点(我将留给您验证.NET API是否一致)。我的结果(在Tridion 2011 SP1上)如下:

1) 。作为受托人且不模拟的模拟用户将成为他自己。 2). 作为受托人并进行模拟的模拟用户将成为他们模拟的人(注意,您通常不希望创建这样的用户)。 3). 调用模拟的非模拟用户仍然是他自己

显然,很大程度上取决于进程标识是否是模拟用户。也许在某些情况下,您可能更愿意避免使用网络服务,并显式地为TcmServiceHost创建一个idenity,以便对此类用户是否可以模拟进行细粒度控制

所以。。。是否需要显式测试进程是否作为模拟程序运行?最好只是尝试模拟,并接受结果。最初的想法当然包括这一意图,但我怀疑此后情况变得更加复杂


+对于这个问题,因为毫无疑问,这一领域的预期行为是绝对必要的

谢谢你的反馈。我已经担心没有更好的机制了事件处理程序不修改content manager中的任何数据,但确实需要对一组可能较大的系统内容进行只读访问。在这种情况下,通常需要一个可配置的“管理员”用户。它确实需要我的代码小心,不要让任何信息泄漏
var isImpersonationUser = IsImpersonationUser(WindowsIdentity.GetCurrent());
var session = isImpersonationUser ? new Session("Administrator") : new Session();
var item = session.GetObject(id);